以下是一个使用 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. 关键点说明
QWebsocket
:核心类,封装了 WebSockets(RFC6455)协议。- 信号与槽:
connected()
/disconnected()
:连接状态变化。textMessageReceived()
:收到文本消息时触发。
- 错误处理:
errorOccurred()
:处理网络或协议错误。
- 测试服务器:
- ws://echo.websocket.org(一个可用的回显服务)。
5. 扩展功能
- 二进制数据传输:使用
sendBinaryMessage()
+binaryMessageReceived()
。 - SSL/TLS支持:改用
wss://
URL,并配置QSslConfiguration
。
运行后,客户端会发送一条消息到测试服务器,并打印服务器的回复。你可以替换为自己的后端服务地址进行实际开发!
内容由零声教学AI助手提供,问题来源于学员提问