Progtwigción de chat con PyQt y Socket

He escrito un progtwig que en la sección del cliente ocurre un error con frecuencia, creo que el error proviene de la función de socket en client.py . ¿Qué tengo que hacer?

server.py:

 # This is my server code , this code has no problems import asyncore import socket clients = {} class MainServerSocket(asyncore.dispatcher): def __init__(self, port): asyncore.dispatcher.__init__(self) self.create_socket(socket.AF_INET, socket.SOCK_STREAM) self.bind(('',port)) self.listen(5) def handle_accept(self): newSocket, address = self.accept( ) clients[address] = newSocket print "Connected from", address SecondaryServerSocket(newSocket) class SecondaryServerSocket(asyncore.dispatcher_with_send): def handle_read(self): receivedData = self.recv(8192) if receivedData: every = clients.values() for one in every: one.send(receivedData+'\n') else: self.close( ) def handle_close(self): print "Disconnected from", self.getpeername( ) one = self.getpeername( ) del clients[one] MainServerSocket(21567) asyncore.loop( ) 

cliente.py:

 from PyQt4 import QtGui , QtCore from socket import * import thread import sys HOST = 'localhost' PORT = 21567 BUFSIZE = 1024 ADDR = (HOST, PORT) tcpCliSock = socket(AF_INET, SOCK_STREAM) tcpCliSock.connect(ADDR) class MainWindow(QtGui.QMainWindow): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) self.socket() roomLabel = QtGui.QLabel('room') self.browser = QtGui.QTextBrowser() self.browser.backwardAvailable self.textEdit = QtGui.QTextEdit() self.textEdit.setMaximumSize(QtCore.QSize(400,60)) #4 edit line self.connect(self.browser, QtCore.SIGNAL("returnPressed()"),self.callback) SendButton = QtGui.QPushButton('Send') SendButton.setMaximumSize(QtCore.QSize(400,60)) SendButton.clicked.connect(self.callback) layoutINlayout = QtGui.QHBoxLayout() layoutINlayout.addWidget(self.textEdit) layoutINlayout.addWidget(SendButton) widget = QtGui.QWidget() self.setCentralWidget(widget) self.layout = QtGui.QVBoxLayout() self.layout.addWidget(self.browser) mainwindow = QtGui.QVBoxLayout() mainwindow.addLayout (self.layout ) mainwindow.addLayout (layoutINlayout ) widget.setLayout(mainwindow) self.setWindowFlags(QtCore.Qt.WindowTitleHint ) def callback(self, event): message = self.textEdit.toPlainText() tcpCliSock.send(message) def add(self, data): self.browser.setText(data) #i think the error comes from socket func: def socket(self): def loop0(): while 1: print '1' data = tcpCliSock.recv(BUFSIZE) if data: self.add(data) thread.start_new_thread(loop0, ()) if __name__ == '__main__': app = QtGui.QApplication(sys.argv) app.setStyle('chat') window = MainWindow() window.setWindowTitle("pro IJ cracker v2") window.setWindowIcon(QtGui.QIcon("img/go.png")) window.show() sys.exit(app.exec_()) 

Mis sugerencias son para

1) Utilice QThread

2) No modifique directamente los widgets en su hilo principal de otro hilo. En su lugar, emita una señal de su QThread cada vez que haya datos.

También para obtener información rápida sobre POR QUÉ su configuración de subprocesos actual está fallando, intente simplemente envolver e imprimir la excepción:

  def loop0(): while 1: print '1' try: data = tcpCliSock.recv(BUFSIZE) if data: self.add(data) except Exception, e: print "ERROR:", e raise