ZBLOG

Qt实现一个websocket的客户端,与服务器通信

以下是一个使用 Qt 实现 WebSocket 客户端的完整示例代码,包含连接服务器、发送消息、接收消息和错误处理的基本功能。

1. 环境准备

确保你的项目已启用 Qt WebSockets 模块。在 .pro 文件中添加:

QT += websockets

2. WebSocket 客户端实现

头文件 (websocketclient.h)

#ifndef WEBSOCKETCLIENT_H
#define WEBSOCKETCLIENT_H

#include <QObject>
#include <QWebSocket>

class WebSocketClient : public QObject
{
    Q_OBJECT
public:
    explicit WebSocketClient(const QUrl &url, QObject *parent = nullptr);
    void sendMessage(const QString &message);

signals:
    void connected();
    void disconnected();
    void messageReceived(const QString &message);
    void errorOccurred(const QString &error);

private slots:
    void onConnected();
    void onDisconnected();
    void onTextMessageReceived(const QString &message);
    void onError(QAbstractSocket::SocketError error);

private:
    QWebSocket m_webSocket;
    QUrl m_url;
};

#endif // WEBSOCKETCLIENT_H

源文件 (websocketclient.cpp)

#include "websocketclient.h"
#include <QDebug>

WebSocketClient::WebSocketClient(const QUrl &url, QObject *parent)
    : QObject(parent), m_url(url)
{
    connect(&m_webSocket, &QWebSocket::connected, this, &WebSocketClient::onConnected);
    connect(&m_webSocket, &QWebSocket::disconnected, this, &WebSocketClient::onDisconnected);
    connect(&m_webSocket, &QWebSocket::textMessageReceived,
            this, &WebSocketClient::onTextMessageReceived);
    
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
        connect(&m_webSocket, SIGNAL(errorOccurred(QAbstractSocket:: SocketError)),
                this , SLOT(onError(QAbstract Socket :: Socket Error)));
#else 
        connect(&m web socket , SIGNAL (error (Q Abstract Socket :: Socket Error )),
                this , SLOT (on Error (Q Abstract Socket :: Socket Error )));
#endif
    
}

void Web socket Client ::connect To Server () {
     if (!m web socket.is Valid()) { 
         q Debug() <<"Connecting to server:"<< m url.toString(); 
         m web socket.open(m url); 
     } else { 
         q Warning()<<"Already connected or connecting"; 
     }
}

void Web socket Client ::send Message (const QString& message) { 
     if(m web socket.state() == Q Abstract Socket :: Connected State) { 
         q Debug()<<"Sending message:"<< message; 
         m web socket.send Text Message(message); 
     } else { 
         emit error Occurred("Not connected to server"); 
     }
}

// Slots implementation 

void Websocket client ::on Connected (){  
      q Debug()<<"Connected!";  
      emit connected();  
}  

void Websocket client ::on Disconnected (){  
      q Debug()<<"Disconnected!";  
      emit disconnected();  
}  

void Websocket client ::on Text Message Received (const QString& msg){   
       q Debug()<<"Received:"<< msg ;   
       emit message Received(msg);   
}  

void Websocket client ::on Error(Q Abstract Socket :: Socket Error err){    
       const auto errMsg= "Error: "+ m web sock et.error String();    
       q Critical()<<err Msg ;     
       emit error Occurred(err Msg);     
}

3. 使用示例

主程序 (main.cpp)

#include <QCoreApplication>
#include "websocketclient.h"

int main(int argc, char *argv[])
{
   Q Core Application app(argc , argv);

   const auto server Url=QUrl("ws://echo.websocket.org"); // Test server

   Web socket Client client(server Url);

   // Connect signals for logging purposes.
   Q Object::connect (&client,&web sock et Client::connected,[ ](){   
          std out <<"Successfully connected.\n";   
          client.send Message("Hello from Qt!");   
   });

   // Print received messages.
   Q Object::connect (&client,&web sock et Client::message Received,[ ](const auto& msg){    
          std out <<"Server replied:"<<msg<<"\n";    
          app.exit(); // Exit after receiving reply in this example.    
   });

   // Handle errors.
   Q Object::connect (&client,&web sock et Client::error Occurred,[ ](const auto& err){     
          std cerr <<err<<"\n";     
          app.exit(-1);      
   });

   return app.exec();
}

4. 关键点说明

  1. QWebsocket:核心类,封装了 WebSockets(RFC6455)协议。
  2. 信号与槽
    • connected() / disconnected():连接状态变化。
    • textMessageReceived():收到文本消息时触发。
  3. 错误处理
    • errorOccurred():处理网络或协议错误。
  4. 测试服务器

5. 扩展功能

  • 二进制数据传输:使用 sendBinaryMessage() + binaryMessageReceived()
  • SSL/TLS支持:改用 wss:// URL,并配置 QSslConfiguration

运行后,客户端会发送一条消息到测试服务器,并打印服务器的回复。你可以替换为自己的后端服务地址进行实际开发!


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=23403

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?