警告
本节包含自动从 C++ 转译到 Python 的代码段,可能包含错误。
WebSocket 服务器示例#
一个示例 WebSocket 服务器,它将发送给它的消息回显。
描述#
echoserver 示例实现了一个 WebSocket 服务器,它会回显发送给它的所有内容。
代码#
我们首先创建一个 QWebSocketServer
(`new QWebSocketServer()`). 创建后,我们在指定的 port
上监听所有本地网络接口 (`QHostAddress::Any`)。
def __init__(self, port, debug, parent): QObject(parent), m_pWebSocketServer(QWebSocketServer("Echo Server", QWebSocketServer.NonSecureMode, self)), m_debug(debug) if m_pWebSocketServer.listen(QHostAddress.Any, port): if m_debug: print("Echoserver listening on port", port) m_pWebSocketServer.newConnection.connect( self.onNewConnection) m_pWebSocketServer.closed.connect(self.closed)
如果监听成功,我们将 `newConnection()` 信号连接到槽 `onNewConnection()`。每当一个新的 WebSocket 客户端连接到我们的服务器时,都将抛出 `newConnection()` 信号。
def onNewConnection(self): pSocket = m_pWebSocketServer.nextPendingConnection() pSocket.textMessageReceived.connect(self.processTextMessage) pSocket.binaryMessageReceived.connect(self.processBinaryMessage) pSocket.disconnected.connect(self.socketDisconnected) m_clients << pSocket
接收到新的连接时,获取客户端 QWebSocket
(`nextPendingConnection()`), 并将我们感兴趣的信号连接到我们的槽 (`textMessageReceived()`、`binaryMessageReceived()` 和 `disconnected()`)。客户端套接字被记住在列表中,以防我们稍后需要使用它(在这个示例中,对此未进行任何操作)。
def processTextMessage(self, message): pClient = QWebSocket(sender()) if m_debug: print("Message received:", message) if pClient: pClient.sendTextMessage(message)
每当 `processTextMessage()` 被触发时,我们获取发送者,如果有效,发送回原始消息 (`sendTextMessage()`)。对于二进制消息,执行相同的操作。
def processBinaryMessage(self, message): pClient = QWebSocket(sender()) if m_debug: print("Binary Message received:", message) if pClient: pClient.sendBinaryMessage(message)
唯一的不同之处在于,消息现在是 QByteArray 而不是 QString。
def socketDisconnected(self): pClient = QWebSocket(sender()) if m_debug: print("socketDisconnected:", pClient) if pClient: m_clients.removeAll(pClient) pClient.deleteLater()
每当套接字断开连接时,我们将其从客户端列表中删除并删除套接字。注意:最好使用 `deleteLater()` 删除套接字。