我正在构建一个最小的套接字服务器,它在收到消息时显示一个窗口。
服务器使用 newConnection 信号获取客户端连接并为每个套接字连接正确的信号(已连接、已断开和 readyRead)。
当运行服务器程序,并将一些数据发送到正确的地址时,对于每个发送的数据,连接一个 QTCPSocket,然后是 readyRead,然后立即断开连接。在 readyRead 回调中, readAll 什么也不返回。(我想这是断开信号的原因)。
尽管如此,客户端没有收到“断管错误”,并且可以继续发送数据。
这怎么可能发生?
这是代码:
class Client(QObject):
def connects(self):
self.connect(self.socket, SIGNAL("connected()"), SLOT(self.connected()))
self.connect(self.socket, SIGNAL("disconnected()"), SLOT(self.disconnected()))
self.connect(self.socket, SIGNAL("readyRead()"), SLOT(self.readyRead()))
self.socket.error.connect(self.error)
print "Client Connected from IP %s" % self.socket.peerAddress().toString()
def error(self):
print "error somewhere"
def connected(self):
print "Client Connected Event"
def disconnected(self):
self.readyRead()
print "Client Disconnected"
def readyRead(self):
print "reading"
msg = self.socket.readAll()
print QString(msg), len(msg)
n = Notification(QString(msg))
n.show()
class Server(QObject):
def __init__(self, parent=None):
QObject.__init__(self)
self.clients = []
def setup_client_socket(self):
print "incoming"
client = Client(self)
client.socket = self.server.nextPendingConnection()
#self.client.socket.nextBlockSize = 0
client.connects()
self.clients.append(client)
def StartServer(self):
self.server = QTcpServer()
self.server.listen(QHostAddress.LocalHost, 8888)
print self.server.isListening(), self.server.serverAddress().toString(), self.server.serverPort()
self.server.newConnection.connect(self.setup_client_socket)
更新: 我直接使用 python 标准库中的 socket 模块进行了测试,它可以工作。所以我的机器和网络的一般设置不是那里的罪魁祸首。这可能是一些 QT 问题。