WebSocket 服务器
// websocketserver.h
#ifndef WEBSOCKETSERVER_H
#define WEBSOCKETSERVER_H
#include <QObject>
#include <QWebSocketServer>
#include <QWebSocket>
class WebSocketServer : public QObject
{
Q_OBJECT
public:
explicit WebSocketServer(quint16 port, QObject *parent = nullptr);
~WebSocketServer();
private slots:
void onNewConnection();
void processTextMessage(QString message);
void socketDisconnected();
private:
QWebSocketServer *m_pWebSocketServer;
QList<QWebSocket *> m_clients;
};
#endif // WEBSOCKETSERVER_H
// websocketserver.cpp
#include "websocketserver.h"
WebSocketServer::WebSocketServer(quint16 port, QObject *parent) :
QObject(parent),
m_pWebSocketServer(new QWebSocketServer(QStringLiteral("Echo Server"),
QWebSocketServer::NonSecureMode,
this))
{
if (m_pWebSocketServer->listen(QHostAddress::Any, port)) {
connect(m_pWebSocketServer, &QWebSocketServer::newConnection,
this, &WebSocketServer::onNewConnection);
qDebug() << "WebSocket server listening on port" << port;
}
}
WebSocketServer::~WebSocketServer()
{
m_pWebSocketServer->close();
qDeleteAll(m_clients.begin(), m_clients.end());
}
void WebSocketServer::onNewConnection()
{
QWebSocket *pSocket = m_pWebSocketServer->nextPendingConnection();
connect(pSocket, &QWebSocket::textMessageReceived,
this, &WebSocketServer::processTextMessage);
connect(pSocket, &QWebSocket::disconnected,
this, &WebSocketServer::socketDisconnected);
m_clients << pSocket;
}
void WebSocketServer::processTextMessage(QString message)
{
QWebSocket *pSender = qobject_cast<QWebSocket *>(sender());
if (pSender) {
pSender->sendTextMessage(message); // Echo message back to sender
}
}
void WebSocketServer::socketDisconnected()
{
QWebSocket *pClient = qobject_cast<QWebSocket *>(sender());
if (pClient) {
m_clients.removeAll(pClient);
pClient->deleteLater();
}
}
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);
private slots:
void onConnected();
void onTextMessageReceived(QString message);
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, [](){ qDebug() << "WebSocket disconnected"; });
m_webSocket.open(QUrl(url));
}
void WebSocketClient::onConnected()
{
qDebug() << "WebSocket connected";
connect(&m_webSocket, &QWebSocket::textMessageReceived,
this, &WebSocketClient::onTextMessageReceived);
m_webSocket.sendTextMessage(QStringLiteral("Hello, world!"));
}
void WebSocketClient::onTextMessageReceived(QString message)
{
qDebug() << "Message received:" << message;
}
main.cpp
#include <QCoreApplication>
#include "websocketserver.h"
#include "websocketclient.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
WebSocketServer server(1234); // 创建服务器,监听端口 1234
WebSocketClient client(QUrl(QStringLiteral("ws://localhost:1234"))); // 创建客户端,连接到服务器
return a.exec();
}
代码说明
- WebSocketServer 类:实现了一个简单的 WebSocket 服务器。服务器监听新连接,并回显收到的消息。
- WebSocketClient 类:实现了一个简单的 WebSocket 客户端。客户端连接到服务器,发送一条消息,并输出接收到的消息。
- main.cpp:启动 WebSocket 服务器和客户端。