2015-04-04 69 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