[英]Python PyQt4: Using QTcpServer to handle data from client, but I can't receive the data
我很困惑,為什么在官方示例中QTcpSocket實例可以在連接之前將文本發送到客戶端。 連接進入后,結果是: New connection came 0 New connection ran into thread: 944
我的代碼位於內容的底部,基於官方示例[threadedfortuneserver.py] 。
# -*- coding: utf-8 -*-
__author__ = 'erliang'
# TODO:消息處理以及UI響應
from PyQt4.QtCore import QThread, pyqtSignal
from PyQt4.QtGui import QMessageBox, QApplication
from PyQt4.QtNetwork import QTcpSocket, QTcpServer, QHostAddress
from ui import ServerWindow
class Socket(QTcpSocket):
def __init__(self, parent=None):
super(Socket, self).__init__(parent)
self.connected.connect(self.on_connected)
self.disconnected.connect(self.on_disconnected)
self.readyRead.connect(self.on_ready_read)
self.error.connect(self.on_error)
def on_connected(self):
print "Socket connected!"
def on_disconnected(self):
print "Socket disconnected!"
def on_ready_read(self):
print "Received data:", self.readAll()
def on_error(self):
print "Error occurred:", self.errorString()
class ChatThread(QThread):
error = pyqtSignal(QTcpSocket.SocketError)
def __init__(self, socketDescriptor, parent):
super(ChatThread, self).__init__(parent)
self.socketDescriptor = socketDescriptor
self.received_data = None
def run(self):
# 在此處新建線程處理客戶端消息
self.tcp = Socket()
print self.tcp.state()
print "New connection ran into thread:", self.socketDescriptor
if not self.tcp.setSocketDescriptor(self.socketDescriptor):
self.error.emit(self.tcp.error())
return
# self.tcp.disconnectFromHost()
# self.tcp.waitForDisconnected()
class ChatServer(QTcpServer):
def __init__(self, parent=None):
super(ChatServer, self).__init__(parent)
self.newConnection.connect(self.on_new_connection)
def incomingConnection(self, socketDescriptor):
# print "New connection came!", socketDescriptor
self.thread = ChatThread(socketDescriptor, self)
self.thread.finished.connect(self.thread.deleteLater)
self.thread.start()
def on_new_connection(self):
print "New connection came"
class Server(ServerWindow):
def __init__(self):
super(Server, self).__init__()
self.StartServerButton.clicked.connect(self.start_server)
self.StopServerButton.clicked.connect(self.stop_server)
self.chat_server = ChatServer()
# self.ClientLogTable.setRowCount(2)
# self.ClientLogTable.setItem(1, 1, QTableWidgetItem('123'))
def start_server(self):
# GUi與Socket操作不能在同一線程, 每次打開服務器便新建一個線程
if not self.chat_server.isListening():
addr = QHostAddress()
addr.setAddress('127.0.0.1')
if not self.chat_server.listen(addr, 8888):
QMessageBox.critical(self, u"服務器", u"無法初始化服務器: %s." % self.server.errorString())
self.close()
return
self.InfoLabel.setText(u'服務器IP:{0} 端口:{1}'.format(self.chat_server.serverAddress().toString(),
self.chat_server.serverPort()))
def stop_server(self):
if self.chat_server.isListening():
self.chat_server.close()
self.InfoLabel.setText(u'服務器尚未啟動!')
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
client = Server()
client.show()
sys.exit(app.exec_())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.