我编写了一个程序,在客户端部分经常出现错误,我认为该错误来自socket
中的client.py
函数。我该怎么办?
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( )
client.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_())
答案 0 :(得分:5)
我的建议是
1)使用QThread
2)不要直接从另一个线程修改主线程中的小部件。相反,每次有数据时都会从QThread发出信号。
还有一些关于为什么当前线程设置崩溃的快速信息,请尝试包装并打印异常:
def loop0():
while 1:
print '1'
try:
data = tcpCliSock.recv(BUFSIZE)
if data: self.add(data)
except Exception, e:
print "ERROR:", e
raise