2015-04-04 27 views
0

我是python的新手,我目前正在使用Python中的聊天室程序(仍在進行中......)。我也爲我的程序製作了一個GUI。最初,我製作了兩個py文件,一個用於GUI,一個用於聊天功能。他們兩人分開時都很完美。之後,我合併了這兩個文件。我面臨以下兩個問題:用Python和PyGTK編寫的聊天程序的問題

  1. 我的一個線程(target = loadMsg)用於等待主機的味精和打印出來的屏幕上。問題是它每次延遲一個msg。例如,我向主機發送了「1」,主機應立即返回「1」。但是,我收到的「1」沒有出現在我的屏幕上。然後我發送一個「2」給主機,主機應該立即回覆「2」。然後,我的屏幕顯示「1」,但直到主機向我發送「3」給主機回覆「3」之前,「2」仍然丟失。哪裏有問題?

  2. 這是一個技術問題。我正在測試聊天室的穩定性,發現我的味精中約有10%在傳輸過程中消失,這種情況是隨機發生的。我該如何解決這個問題? 對不起,我英文很差。我希望有人能幫助我it.T_T

這是我送給你的參考代碼: ---客戶

import pygtk,gtk 
import logging 
from threading import * 
import socket 

DEBUG = 1 
HOST = '' 
PORT = 8018 
TIMEOUT = 5 
BUF_SIZE = 1024 

class Base(): 
    def reload(self): 
     try: 
      buf = self.sock.recv(BUF_SIZE) 
      print buf 
      self.addMsg(buf) 
     except: 
      pass 
    def reload_butt(self,widget): 
     try: 
      self.thread = Thread(target=self.reload) 
      self.thread.start() 
     except: 
      pass 

    def loadMsg(self): 
     try: 
      while True : 
        buf = self.sock.recv(BUF_SIZE) 
       print buf 
       self.addMsg(buf) 
      except: 
        self.sock.close() 
    def sendMsg(self,widget): 
     if DEBUG : print "Send Msg" 
     if self.entry.get_text() : self.sock.send(self.entry.get_text()) 
      self.entry.set_text("") 
    def addMsg(self,string): 
     if DEBUG : print "Try to add Msg" 
     if self.entry.get_text() : 
      iter = self.buffer1.get_iter_at_offset(-1) 
      self.buffer1.insert(iter,("\n Username: "+string)) 
      self.entry.set_text("") 
      self.adj = self.scrolled_window.get_vadjustment() 
      self.adj.set_value(self.adj.upper - self.adj.page_size) 
      if DEBUG : print "Add msg ok" 
    def destroy(self,widget): 
     if DEBUG : print "Destroy function called" 
     self.sock.close() 
     gtk.main_quit() 

    def __init__(self,sock): 
     if DEBUG : print "Initializing..." 
     self.sock = sock 

     self.win=gtk.Window() 
     self.win.connect("destroy",self.destroy) 

     self.vbox=gtk.VBox() 
     self.win.add(self.vbox) 

     self.view=gtk.TextView() 
     self.view.set_editable(False) 
     self.buffer1=self.view.get_buffer() 

     self.scrolled_window=gtk.ScrolledWindow() 
     self.scrolled_window.set_policy(gtk.POLICY_AUTOMATIC,gtk.POLICY_AUTOMATIC) 
     self.scrolled_window.add(self.view) 
     self.vbox.add(self.scrolled_window) 

     self.entry=gtk.Entry() 
     self.entry.connect("activate",self.sendMsg) 

     self.enter=gtk.Button("Enter") 
     self.enter.connect("clicked",self.sendMsg) 

     self.reload=gtk.Button("Reload") 
     self.reload.connect("clicked",self.reload_butt) 

     self.hbox=gtk.HBox() 
     self.hbox.add(self.entry) 
     self.hbox.pack_start(self.reload,False,False) 
     self.hbox.pack_start(self.enter,False,False) 
     self.vbox.pack_start(self.hbox,False,False) 

     self.win.show_all() 
     if DEBUG : print "Finish initializing" 
    def main(self): 
     try : 
      gtk.main() 
     except : 

      print "Error!!!" 
def main() : 
    try : 
     sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     sock.connect((HOST, PORT)) 
     print ('Connecting to '+ str(HOST) +' ' + str(PORT)) 
     base=Base(sock) 
     thread1=Thread(target=base.loadMsg) 
     thread2=Thread(target=base.main) 
     thread2.start() 
     thread1.start() 
    except : 
     print "Err0r!!!" 
     sock.close() 
main() 

---主機(回聲主機)

import socket 

HOST = '' 
PORT = 8018 


s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((HOST, PORT)) 
s.listen(5) 


conn, addr = s.accept() 
print 'Connected by', addr 
try : 
    print "Start!" 
    while True: 
     data = conn.recv(1024) 
      print data 
     reply = data # echo 
     if not reply : break 
      if reply== "!q" : 
        conn.close() 
      break 

     conn.send(reply) 
    conn.close() 
except : 
    print "Error!!!!!" 
    conn.close() 

回答

0

我會認真推薦使用gio庫(glib的一部分)。使用該庫,可以將函數連接到套接字操作,例如數據可用時,或者可以將數據寫入套接字時。庫在必要時會調用這些函數,並且不需要等待循環。哪一種更友善。

http://jcoppens.com/soft/howto/gtk/chat_socket.php包含C程序和Python之間的通信示例,使用gio,它可能對您有用。

這樣,您可以在GUI啓動後開始監視套接字,並且不需要線程來參與通信。

+0

Thz,我會去看看:) – FunnyFunkyBuggy 2015-04-05 05:07:43