Qt如果多线程的话,似乎会出BUG
1.服务端(server.py)
import sys, socket, threading import binascii from PyQt4 import QtCore, QtGui class ListenThread(threading.Thread): def __init__(self, txt, server): threading.Thread.__init__(self) self.txt = txt self.server = server def run(self): self.txt.append('来嘛来嘛\n') while 1: try: client, addr = self.server.accept() self.txt.append('连接来自:{}:{}\n'.format(addr[0], addr[1])) data = client.recv(1024) self.txt.append('收到数据:{}\n'.format(data.decode('utf-8'))) client.send('I Got:'.encode('utf-8') + data) client.close() self.txt.append('关闭客户端\n') except: self.txt.append('关闭连接\n') break class ControlThread(threading.Thread): def __init__(self, txt): threading.Thread.__init__(self) self.txt = txt self.event = threading.Event() self.event.clear() def run(self): self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.server.bind(('', 1051)) self.server.listen(1) self.txt.append('正在等待连接\n') self.lsn = ListenThread(self.txt, self.server) self.lsn.setDaemon(True) self.lsn.start() self.event.wait() self.server.close() def stop(self): self.event.set() class MyWindow(QtGui.QWidget): def __init__(self): QtGui.QWidget.__init__(self) self.setWindowTitle('服务端') self.resize(485, 300) self.btn1 = QtGui.QPushButton('开始监听') self.btn2 = QtGui.QPushButton('停止监听') self.txt = QtGui.QTextEdit() self.grid = QtGui.QGridLayout() self.grid.addWidget(self.btn1, 0, 0) self.grid.addWidget(self.btn2, 0, 1) self.grid.addWidget(self.txt, 1, 0, 1, 2) self.setLayout(self.grid) self.connect(self.btn1, QtCore.SIGNAL('clicked()'), self.onBtn1) self.connect(self.btn2, QtCore.SIGNAL('clicked()'), self.onBtn2) def onBtn1(self): self.ctrl = ControlThread(self.txt) self.ctrl.setDaemon(True) self.ctrl.start() def onBtn2(self): self.ctrl.stop() app = QtGui.QApplication(sys.argv) mywindow = MyWindow() mywindow.show() app.exec_()
2.客户端(client.py)
import sys, socket, threading import binascii from PyQt4 import QtCore, QtGui class ListenThread(threading.Thread): def __init__(self, txt, server): threading.Thread.__init__(self) self.txt = txt self.server = server def run(self): self.txt.append('来嘛来嘛\n') while 1: try: client, addr = self.server.accept() self.txt.append('连接来自:{}:{}\n'.format(addr[0], addr[1])) data = client.recv(1024) self.txt.append('收到数据:{}\n'.format(data.decode('utf-8'))) client.send('I Got:'.encode('utf-8') + data) client.close() self.txt.append('关闭客户端\n') except: self.txt.append('关闭连接\n') break class ControlThread(threading.Thread): def __init__(self, txt): threading.Thread.__init__(self) self.txt = txt self.event = threading.Event() self.event.clear() def run(self): self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.server.bind(('', 1051)) self.server.listen(1) self.txt.append('正在等待连接\n') self.lsn = ListenThread(self.txt, self.server) self.lsn.setDaemon(True) self.lsn.start() self.event.wait() self.server.close() def stop(self): self.event.set() class MyWindow(QtGui.QWidget): def __init__(self): QtGui.QWidget.__init__(self) self.setWindowTitle('服务端') self.resize(485, 300) self.btn1 = QtGui.QPushButton('开始监听') self.btn2 = QtGui.QPushButton('停止监听') self.txt = QtGui.QTextEdit() self.grid = QtGui.QGridLayout() self.grid.addWidget(self.btn1, 0, 0) self.grid.addWidget(self.btn2, 0, 1) self.grid.addWidget(self.txt, 1, 0, 1, 2) self.setLayout(self.grid) self.connect(self.btn1, QtCore.SIGNAL('clicked()'), self.onBtn1) self.connect(self.btn2, QtCore.SIGNAL('clicked()'), self.onBtn2) def onBtn1(self): self.ctrl = ControlThread(self.txt) self.ctrl.setDaemon(True) self.ctrl.start() def onBtn2(self): self.ctrl.stop() app = QtGui.QApplication(sys.argv) mywindow = MyWindow() mywindow.show() app.exec_()