警告

本节包含自动从 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()` 删除套接字。