Explicación detallada de WebSocket y uso de QWebSocket para implementar servidor y cliente (incluidos ejemplos de código)

Tabla de contenido

1. Antecedentes del nacimiento de WebSocket

2. Características de WebSocket:

3. Introducción a WebSocket

4. Ventajas de WebSocket

5. Cliente de comunicación QWebSocket:

6. Comunicación QWebSocket—servidor:


1. Antecedentes del nacimiento de WebSocket

Al principio, muchos sitios web utilizaban encuestas (también llamadas encuestas cortas) para implementar tecnología push.

El sondeo significa que el navegador envía solicitudes HTTP al servidor a intervalos regulares y luego el servidor devuelve los datos más recientes al cliente.

2. Características de WebSocket:

1) Basado en el protocolo TCP, la implementación del lado del servidor es relativamente fácil;

2) Tiene buena compatibilidad con el protocolo HTTP. Los puertos predeterminados también son 80 y 443.

Y la fase de protocolo de enlace utiliza el protocolo HTTP, por lo que no es fácil de bloquear durante el protocolo de enlace y puede pasar varios servidores proxy HTTP;

3) El formato de datos es relativamente liviano, tiene una sobrecarga de rendimiento baja y una comunicación eficiente;

4) Puedes enviar texto o datos binarios;

5) No hay restricción de origen y el cliente puede comunicarse con cualquier servidor;

6) El identificador del protocolo es ws (o wss si está cifrado) y la dirección del servidor es la URL,

Parece: ws://example.com:80/some/path.

3. Introducción a WebSocket

WebSocket es un protocolo de transporte de red que permite la comunicación full-duplex a través de una única conexión TCP y está ubicado en la capa de aplicación del modelo OSI;

4. Ventajas de WebSocket

1) Menos gastos generales de control: una vez creada la conexión, cuando se intercambian datos entre el servidor y el cliente, el encabezado del paquete utilizado para el control del protocolo es relativamente pequeño;

2) Mayor rendimiento en tiempo real: dado que el protocolo es full-duplex, el servidor puede enviar datos de forma proactiva al cliente en cualquier momento. En comparación con las solicitudes HTTP, que deben esperar a que el cliente inicie una solicitud antes de que el servidor pueda responder, el retraso es significativamente menor;

3) Mantener el estado de la conexión: a diferencia de HTTP, WebSocket necesita crear una conexión primero, lo que lo convierte en un protocolo con estado, y parte de la información de estado se puede omitir durante las comunicaciones posteriores;

4) Mejor soporte binario: WebSocket define marcos binarios, que pueden manejar contenido binario más fácilmente que HTTP;

5) Puede admitir extensiones: WebSocket define extensiones y los usuarios pueden ampliar el protocolo e implementar algunos subprotocolos personalizados.

Debido a que WebSocket tiene las ventajas anteriores, se usa ampliamente en campos como mensajería instantánea/IM, audio y video en tiempo real, educación en línea y juegos.

5. Cliente de comunicación QWebSocket:

Algunas interfaces principales utilizadas: (pasos principales)

#include <QWebSocket>
QWebSocket* m_pDataRecvWS = new QWebSocket();
m_pDataRecvWS->open(QUrl("URL"));//形如:ws://example.com:80/some/path

//客户端发出请求后,服务器会处理发相应的信号:
//1、连接成功后
connected();

//2、连接失败
disconnected();

//3、收到数据
textMessageReceived();

//常用的函数--------------------------------------
//发送消息
sendTextMessage()

Un ejemplo sencillo:

//例子
QTimer m_timer = new QTimer();//重连计时器
if (m_pDataRecvWS == nullptr)
{
   m_pDataRecvWS = new QWebSocket();
   connect(m_pDataRecvWS, &QWebSocket::disconnected, this, &WebSocketClient::slotOnDisConnected, Qt::AutoConnection);
   connect(m_pDataRecvWS, &QWebSocket::textMessageReceived, this, &WebSocketClient::slotOnTextReceived, Qt::AutoConnection);
   connect(m_pDataRecvWS, &QWebSocket::connected, this, &WebSocketClient::slotOnConnected, Qt::AutoConnection);
   connect(m_timer, QTimer::timeout, this, &WebSocketClient::slotReconnect, Qt::AutoConnection);
   m_pDataRecvWS->open(QUrl(m_strURL));
}

//连接成功-关闭重连的计时器
void WebSocketClient::slotOnConnected()
{
    m_bConnectStatus = true;
    m_timer->stop();
}

//连接失败-启动计时器准备重连
void WebSocketClient::slotOnDisConnected()
{
    m_bConnectStatus = false;
    m_timer->start(3000);/*-<当连接失败时,触发重连计时器,设置计数周期为3秒 */
}

//重连
void WebSocketClient::slotReconnect()
{
    m_pDataRecvWS->abort();
    m_pDataRecvWS->open(QUrl(m_strURL));
}

//收到消息
void WebSocketClient::slotOnTextReceived(const QString& msg)
{
   // todo
}


6. Comunicación QWebSocket—servidor:

Algunas interfaces principales utilizadas: (pasos principales)

//声明变量
QWebSocketServer *m_pWebSocketServer;
QList<QWebSocket *> m_clients;//保存连接的客户端
unsigned short mPort;//端口号
QString mServerName;//服务器名字

//1、创建服务器
m_pWebSocketServer = new QWebSocketServer(mServerName, QWebSocketServer::NonSecureMode, this);

//2、监听
m_pWebSocketServer->listen(QHostAddress::LocalHost, mPort);//端口号

//3、有新的连接,会发这个信号
connect(m_pWebSocketServer, &QWebSocketServer::newConnection, this, &WebSocketServer::onNewConnection);


//4、获得新的客户端nextPendingConnection
void WebSocketServer::onNewConnection()
{
    auto pSocket = m_pWebSocketServer->nextPendingConnection();
    pSocket->setParent(this);
    connect(pSocket, &QWebSocket::textMessageReceived, this, &WebSocketServer::processMessage);
    connect(pSocket, &QWebSocket::disconnected, this, &WebSocketServer::socketDisconnected);
    m_clients << pSocket;//放进去客户端列表
}

//5、接收到信息
void WebSocketServer::processMessage(const QString &message)
{
    QWebSocket *pSender = qobject_cast<QWebSocket *>(sender());
    for (QWebSocket *pClient : qAsConst(m_clients))
    {
        emit processServerMessage(message);
        if (pClient != pSender) //don't echo message back to sender
            pClient->sendTextMessage(message);
    }
}

//6、断开连接
void WebSocketServer::socketDisconnected()
{
    QWebSocket *pClient = qobject_cast<QWebSocket *>(sender());
    QTextStream(stdout) << getIdentifier(pClient) << " disconnected!\n";
    if (pClient)
    {
        m_clients.removeAll(pClient);
        pClient->deleteLater();
    }
}

Supongo que te gusta

Origin blog.csdn.net/bigger_belief/article/details/130725799
Recomendado
Clasificación