日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt文档阅读笔记-构造WebSocket服务端

發(fā)布時(shí)間:2025/3/15 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt文档阅读笔记-构造WebSocket服务端 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

?

?

基本概念

代碼與實(shí)例

程序打包下載


?

基本概念

因?yàn)橹苣└懔藗€(gè)Spring Boot的,但是想想,這個(gè)websocket只是一個(gè)協(xié)議而已,C++應(yīng)該也能搞,在此就搞了這篇博文,這里主要是用Qt,寫WebSocket,然后用html寫前端,讓連接上的客戶端,進(jìn)行發(fā)送數(shù)據(jù),接收數(shù)據(jù),單獨(dú)發(fā)送等等等,也就是使用WebSocket做一個(gè)聊天室。

?

?

代碼與實(shí)例

客戶端運(yùn)行:

給這3個(gè)輸入名稱后連接服務(wù)器,填寫返送內(nèi)容:

此時(shí)的數(shù)據(jù),大家。都能收到:

按照固定格式,發(fā)送數(shù)據(jù)給單獨(dú)的某人:

服務(wù)端截圖:

客戶端如下:

<!DOCTYPE HTML> <html><head><meta charset="utf-8"><title>websocket client</title><script type="text/javascript">var ws = null;function WebSocketTest(){if ("WebSocket" in window){alert("瀏覽器支持 WebSocket!");// 打開一個(gè) web socketvar name = document.getElementById("name").value;ws = new WebSocket("ws://192.XXX.XXX.XXX:1234/" + name);//構(gòu)件一個(gè)發(fā)送消息框var context = '<div class="sendMsg">\n' +' 輸入發(fā)送內(nèi)容:<input id="sendWebMsg" />' +' <button onclick="javascript:sendMsgToWS()">發(fā)送</button>' +' </div>';document.getElementById("sendDiv").innerHTML = context;ws.onmessage = function (evt){var received_msg = evt.data;alert("接收到數(shù)據(jù):" + received_msg);};ws.onclose = function(){ // 關(guān)閉 websocketalert("連接已關(guān)閉..."); };}else{// 瀏覽器不支持 WebSocketalert("瀏覽器不支持 WebSocket!");}}function sendMsgToWS(){if(ws != null){var msg = document.getElementById("sendWebMsg").value;ws.send(msg);}}</script></head><body><div id="sse">名稱:<input id="name" /><button onclick="javascript:WebSocketTest()">連接 WebSocket</button></div><div id="sendDiv"></div></body> </html>

服務(wù)端關(guān)鍵代碼:

#include "Server.h" #include <QDebug> #include <QtWebSockets>Server::Server(quint16 port):QObject(nullptr), m_pWebSocketServer(Q_NULLPTR) {m_pWebSocketServer = new QWebSocketServer("WebSocket Server", QWebSocketServer::NonSecureMode, this);if(m_pWebSocketServer->listen(QHostAddress::Any, port)){qDebug() << "WebSocket opened, the port is " << port;connect(m_pWebSocketServer, &QWebSocketServer::newConnection, this, &Server::onNewConnection);} }Server::~Server() {m_pWebSocketServer->close();qDeleteAll(m_clients.begin(), m_clients.end()); }void Server::onNewConnection() {QWebSocket *pSocket = m_pWebSocketServer->nextPendingConnection();connect(pSocket, &QWebSocket::textMessageReceived, this, &Server::processMessage);connect(pSocket, &QWebSocket::disconnected, this, &Server::socketDisconnected);QString localResourceName = pSocket->resourceName();int position = localResourceName.lastIndexOf("/");m_clients << new PeerHost(localResourceName.right(localResourceName.length() - position - 1), pSocket);qDebug() << "new Connection: The name " << pSocket->peerName() << "; The port: " << pSocket->peerPort()<< "; The IP is " << pSocket->peerAddress(); }void Server::processMessage(const QString &message) {QWebSocket *pSender = qobject_cast<QWebSocket *>(sender());QString sendName = this->getHostName(pSender);if(message.left(5) == "name:"){QStringList localSplit = message.split(";");if(localSplit.size() != 2){qDebug() << "message: " << message << "格式錯(cuò)誤";return;}QString hostName = localSplit[0].remove("name:");sendPointClient(sendName + ":" + localSplit[1], hostName);}else{sendAllClient(sendName + ":" + message);} }void Server::sendAllClient(const QString &msg) {QWebSocket *pSender = qobject_cast<QWebSocket *>(sender());for(PeerHost *pClient : qAsConst(m_clients)){if(pClient->m_socket != pSender){pClient->m_socket->sendTextMessage(msg);}} }void Server::sendPointClient(const QString &msg, const QString &name) {for(PeerHost *pClient : qAsConst(m_clients)){if(pClient->m_name == name){pClient->m_socket->sendTextMessage(msg);return;}} }void Server::socketDisconnected() {QWebSocket *pClient = qobject_cast<QWebSocket *>(sender());for(PeerHost *client : qAsConst(m_clients)){qDebug() << client->m_name << " disconnection";if(client->m_socket == pClient){m_clients.removeAll(client);client->m_socket->deleteLater();}} }QString Server::getHostName(QWebSocket *socket) {for(PeerHost *pClient : qAsConst(m_clients)){if(pClient->m_socket == socket){return pClient->m_name;}} }PeerHost::~PeerHost() {delete m_socket; }

?

?

?

程序打包下載

下載地址如下:

https://github.com/fengfanchen/Qt/tree/master/QtWebSocketDemo

?

總結(jié)

以上是生活随笔為你收集整理的Qt文档阅读笔记-构造WebSocket服务端的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。