Python 如何在PyQt5中使用QWebSocket创建websocket客户端
我想在PyQt5中使用QWebSocket创建一个websocket客户端。为了方便起见,假设我有一个websocket服务器,源代码如下:Python 如何在PyQt5中使用QWebSocket创建websocket客户端,python,websocket,client,pyqt5,Python,Websocket,Client,Pyqt5,我想在PyQt5中使用QWebSocket创建一个websocket客户端。为了方便起见,假设我有一个websocket服务器,源代码如下: from PyQt5 import QtCore, QtWebSockets, QtNetwork, QtGui from PyQt5.QtWidgets import QApplication, QMainWindow, QMenu, QAction from PyQt5.QtCore import QUrl class MyServer(QtCore
from PyQt5 import QtCore, QtWebSockets, QtNetwork, QtGui
from PyQt5.QtWidgets import QApplication, QMainWindow, QMenu, QAction
from PyQt5.QtCore import QUrl
class MyServer(QtCore.QObject):
def __init__(self, parent):
super(QtCore.QObject, self).__init__(parent)
self.clients = []
self.server = QtWebSockets.QWebSocketServer(parent.serverName(), parent.secureMode(), parent)
if self.server.listen(QtNetwork.QHostAddress.LocalHost, 1302):
print('Connected: '+self.server.serverName()+' : '
+self.server.serverAddress().toString()+':'+str(self.server.serverPort()))
else:
print('error')
self.server.newConnection.connect(self.onNewConnection)
self.clientConnection = None
print(self.server.isListening())
def onNewConnection(self):
self.clientConnection = self.server.nextPendingConnection()
self.clientConnection.textMessageReceived.connect(self.processTextMessage)
self.clientConnection.binaryMessageReceived.connect(self.processBinaryMessage)
self.clientConnection.disconnected.connect(self.socketDisconnected)
print("newClient")
self.clients.append(self.clientConnection)
def processTextMessage(self, message):
print(message)
if self.clientConnection:
for client in self.clients:
# if client!= self.clientConnection:
client.sendTextMessage(message)
# self.clientConnection.sendTextMessage(message)
def processBinaryMessage(self, message):
print("b:",message)
if self.clientConnection:
self.clientConnection.sendBinaryMessage(message)
def socketDisconnected(self):
if self.clientConnection:
self.clients.remove(self.clientConnection)
self.clientConnection.deleteLater()
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
serverObject = QtWebSockets.QWebSocketServer('My Socket', QtWebSockets.QWebSocketServer.NonSecureMode)
server = MyServer(serverObject)
serverObject.closed.connect(app.quit)
app.exec_()
它可以创建一个websocket服务器,我使用JavaScript对其进行了测试,效果很好。但我可以找到一种使用Qwebsocket创建客户端的方法。我的客户端代码如下:
client = QtWebSockets.QWebSocket("",QtWebSockets.QWebSocketProtocol.Version13,None)
client.open(QUrl("ws://127.0.0.1:1302"))
client.sendTextMessage("asd")
client.close()
服务器似乎没有收到客户机发送的消息,如何创建websocket客户机并使用Qwebsocket发送消息?这是qt控制台程序的典型问题,您需要在python构造函数之外调用您的客户机方法(
\uuuu init\uuu
)
我稍微修改了您的服务器,添加了一些错误测试(没有什么新的内容):
客户端使用一些QTimer
调用\uuuuu init\uuuu
方法之外的所需方法。我还添加了ping/pong方法来检查连接:
import sys
from PyQt5 import QtCore, QtWebSockets, QtNetwork
from PyQt5.QtCore import QUrl, QCoreApplication, QTimer
from PyQt5.QtWidgets import QApplication
class Client(QtCore.QObject):
def __init__(self, parent):
super().__init__(parent)
self.client = QtWebSockets.QWebSocket("",QtWebSockets.QWebSocketProtocol.Version13,None)
self.client.error.connect(self.error)
self.client.open(QUrl("ws://127.0.0.1:1302"))
self.client.pong.connect(self.onPong)
def do_ping(self):
print("client: do_ping")
self.client.ping(b"foo")
def send_message(self):
print("client: send_message")
self.client.sendTextMessage("asd")
def onPong(self, elapsedTime, payload):
print("onPong - time: {} ; payload: {}".format(elapsedTime, payload))
def error(self, error_code):
print("error code: {}".format(error_code))
print(self.client.errorString())
def close(self):
self.client.close()
def quit_app():
print("timer timeout - exiting")
QCoreApplication.quit()
def ping():
client.do_ping()
def send_message():
client.send_message()
if __name__ == '__main__':
global client
app = QApplication(sys.argv)
QTimer.singleShot(2000, ping)
QTimer.singleShot(3000, send_message)
QTimer.singleShot(5000, quit_app)
client = Client(app)
app.exec_()
服务器输出:
G:\Qt\QtTests>python so_qwebsocket_server.py
server name: My Socket
Listening: My Socket:127.0.0.1:1302
True
onNewConnection
newClient
in processTextFrame
Frame: asd ; is_last_frame: True
processTextMessage - message: asd
socketDisconnected
G:\Qt\QtTests>python so_qwebsocket_client.py
client: do_ping
onPong - time: 0 ; payload: b'foo'
client: send_message
timer timeout
客户端输出:
G:\Qt\QtTests>python so_qwebsocket_server.py
server name: My Socket
Listening: My Socket:127.0.0.1:1302
True
onNewConnection
newClient
in processTextFrame
Frame: asd ; is_last_frame: True
processTextMessage - message: asd
socketDisconnected
G:\Qt\QtTests>python so_qwebsocket_client.py
client: do_ping
onPong - time: 0 ; payload: b'foo'
client: send_message
timer timeout
总而言之,如果您在一个简单的GUI中使用您的客户端(例如,将
客户端.sendTextMessage()
移动到\uuuu init\uuuu
之外,并连接一个按钮单击以实际发送消息),由于它的异步性质,它应该可以正常工作 谢谢你,你帮了我很多。嘿,我试着实现服务器。。。点击一个按钮,服务器就启动了,到目前为止还不错。但是当我尝试连接websocket客户端(我使用websocket)时,它无法连接到错误消息``websocket:websocket错误:I/O失败websocket:error running``看起来握手有问题,但我不确定。你能提供一些见解吗?(找到解决方案),我需要将当前窗口作为父窗口传递