Python QtNetwork.qtcsocket.readAll()和QtNetwork.qtcsocket.write()不工作

Python QtNetwork.qtcsocket.readAll()和QtNetwork.qtcsocket.write()不工作,python,pyside,qtcpsocket,Python,Pyside,Qtcpsocket,我正在做一个简单的套接字连接,read.All()和write()并没有给我任何反馈 import PySide.QtNetwork as Network import PySide.QtCore as Core proxyAddress = '127.0.0.1' proxyPort = 1025 tcpSocket = Network.QTcpSocket() tcpSocket.connectToHost(proxyAddress, proxyPort) state()给出 当我试图发

我正在做一个简单的套接字连接,read.All()和write()并没有给我任何反馈

import PySide.QtNetwork as Network
import PySide.QtCore as Core

proxyAddress = '127.0.0.1'
proxyPort = 1025
tcpSocket = Network.QTcpSocket()
tcpSocket.connectToHost(proxyAddress, proxyPort)
state()给出

当我试图发送一些东西时,我得到了以下信息:

tcpSocket.write("Hello")
5L
对于readAll():

哦,为了断开连接,我尝试:

tcpSocket.disconnectFromHost()
它会返回下一行,好像它成功地断开了连接,但当我检查状态时:

tcpSocket.state()
"PySide.QtNetwork.QAbstractSocket.SocketState.ConnectingState"

感谢您的帮助

首先,发出信号的状态为
ConnectingState
,表示尚未建立连接,因此此时执行任何任务都不正确,您必须等待状态为
ConnectedState
。另一方面,您指出的端口可能正被另一个应用程序使用,因为它是通常为另一个任务保留的少量端口。在下一部分中,我将展示一个服务器和客户机的示例(首先启动服务器,然后可以启动所需数量的客户机)。最后,在Qt中,任务不应该同步执行,而是通过信号执行,因为Qt事件循环需要更新内部和外部变量状态

server.py

import uuid
from PySide import QtCore, QtNetwork

class ServerManager(QtCore.QObject):
    def __init__(self, parent=None):
        super(ServerManager, self).__init__(parent)
        self._server = QtNetwork.QTcpServer(self)
        self._server.newConnection.connect(self.on_newConnection)
        self._clients = {}

    def launch(self, address=QtNetwork.QHostAddress.Any, port=9999):
        return self._server.listen(QtNetwork.QHostAddress(address), port)

    @QtCore.Slot()
    def on_newConnection(self):
        socket = self._server.nextPendingConnection()
        socket.readyRead.connect(self.on_readyRead)
        if socket not in self._clients:
            self._clients[socket] = uuid.uuid4()

    @QtCore.Slot()
    def on_readyRead(self):
        socket = self.sender()
        resp = socket.readAll()
        code = self._clients[socket]
        print("From[{}]- message: {}".format(code, resp))
        socket.write("Server: " + str(resp)[::-1])

if __name__ == '__main__':
    import sys
    import signal
    signal.signal(signal.SIGINT, signal.SIG_DFL)
    app = QtCore.QCoreApplication(sys.argv)

    address = '127.0.0.1'
    port = 9000
    server = ServerManager()
    if not server.launch(address, port):
        sys.exit(-1)
    sys.exit(app.exec_())
from PySide import QtCore, QtNetwork

class ClientManager(QtCore.QObject):
    def __init__(self, parent=None):
        super(ClientManager, self).__init__(parent)
        self._socket = QtNetwork.QTcpSocket(self)
        self._socket.stateChanged.connect(self.on_stateChanged)
        self._socket.readyRead.connect(self.on_readyRead)
        self._timer = QtCore.QTimer(self, interval=1000)
        self._timer.timeout.connect(self.sendMessage)

    def launch(self, address=QtNetwork.QHostAddress.Any, port=9999):
        return self._socket.connectToHost(QtNetwork.QHostAddress(address), port)

    @QtCore.Slot(QtNetwork.QAbstractSocket.SocketState)
    def on_stateChanged(self, state):
        if state == QtNetwork.QAbstractSocket.ConnectedState:
            self._timer.start()
            print("connected")
        elif state == QtNetwork.QAbstractSocket.UnconnectedState:
            print("disconnected")
            QtCore.QCoreApplication.quit()

    @QtCore.Slot()
    def sendMessage(self):
        if self._socket.state() == QtNetwork.QAbstractSocket.ConnectedState:
            msg = QtCore.QDateTime.currentDateTime().toString()
            self._socket.write(msg) 

    @QtCore.Slot()
    def on_readyRead(self):
        print("Response: ", self._socket.readAll())

if __name__ == '__main__':
    import sys
    import signal
    signal.signal(signal.SIGINT, signal.SIG_DFL)
    app = QtCore.QCoreApplication(sys.argv)
    address = '127.0.0.1'
    port = 9000
    server = ClientManager()
    server.launch(address, port)
    sys.exit(app.exec_())
client.py

import uuid
from PySide import QtCore, QtNetwork

class ServerManager(QtCore.QObject):
    def __init__(self, parent=None):
        super(ServerManager, self).__init__(parent)
        self._server = QtNetwork.QTcpServer(self)
        self._server.newConnection.connect(self.on_newConnection)
        self._clients = {}

    def launch(self, address=QtNetwork.QHostAddress.Any, port=9999):
        return self._server.listen(QtNetwork.QHostAddress(address), port)

    @QtCore.Slot()
    def on_newConnection(self):
        socket = self._server.nextPendingConnection()
        socket.readyRead.connect(self.on_readyRead)
        if socket not in self._clients:
            self._clients[socket] = uuid.uuid4()

    @QtCore.Slot()
    def on_readyRead(self):
        socket = self.sender()
        resp = socket.readAll()
        code = self._clients[socket]
        print("From[{}]- message: {}".format(code, resp))
        socket.write("Server: " + str(resp)[::-1])

if __name__ == '__main__':
    import sys
    import signal
    signal.signal(signal.SIGINT, signal.SIG_DFL)
    app = QtCore.QCoreApplication(sys.argv)

    address = '127.0.0.1'
    port = 9000
    server = ServerManager()
    if not server.launch(address, port):
        sys.exit(-1)
    sys.exit(app.exec_())
from PySide import QtCore, QtNetwork

class ClientManager(QtCore.QObject):
    def __init__(self, parent=None):
        super(ClientManager, self).__init__(parent)
        self._socket = QtNetwork.QTcpSocket(self)
        self._socket.stateChanged.connect(self.on_stateChanged)
        self._socket.readyRead.connect(self.on_readyRead)
        self._timer = QtCore.QTimer(self, interval=1000)
        self._timer.timeout.connect(self.sendMessage)

    def launch(self, address=QtNetwork.QHostAddress.Any, port=9999):
        return self._socket.connectToHost(QtNetwork.QHostAddress(address), port)

    @QtCore.Slot(QtNetwork.QAbstractSocket.SocketState)
    def on_stateChanged(self, state):
        if state == QtNetwork.QAbstractSocket.ConnectedState:
            self._timer.start()
            print("connected")
        elif state == QtNetwork.QAbstractSocket.UnconnectedState:
            print("disconnected")
            QtCore.QCoreApplication.quit()

    @QtCore.Slot()
    def sendMessage(self):
        if self._socket.state() == QtNetwork.QAbstractSocket.ConnectedState:
            msg = QtCore.QDateTime.currentDateTime().toString()
            self._socket.write(msg) 

    @QtCore.Slot()
    def on_readyRead(self):
        print("Response: ", self._socket.readAll())

if __name__ == '__main__':
    import sys
    import signal
    signal.signal(signal.SIGINT, signal.SIG_DFL)
    app = QtCore.QCoreApplication(sys.argv)
    address = '127.0.0.1'
    port = 9000
    server = ClientManager()
    server.launch(address, port)
    sys.exit(app.exec_())

谢谢你的评论。运行connectToHost()后,我需要等待多长时间才能最终连接它?它相当长一段时间处于连接状态。@mikanim,这取决于许多变量,如网络、硬件等,因此没有答案。正确的做法是使用我在示例中所示的信号。