Qt文档阅读笔记-构造WebSocket服务端
生活随笔
收集整理的這篇文章主要介紹了
Qt文档阅读笔记-构造WebSocket服务端
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
?
?
基本概念
代碼與實例
程序打包下載
?
基本概念
因為周末搞了個Spring Boot的,但是想想,這個websocket只是一個協議而已,C++應該也能搞,在此就搞了這篇博文,這里主要是用Qt,寫WebSocket,然后用html寫前端,讓連接上的客戶端,進行發送數據,接收數據,單獨發送等等等,也就是使用WebSocket做一個聊天室。
?
?
代碼與實例
客戶端運行:
給這3個輸入名稱后連接服務器,填寫返送內容:
此時的數據,大家。都能收到:
按照固定格式,發送數據給單獨的某人:
服務端截圖:
客戶端如下:
<!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!");// 打開一個 web socketvar name = document.getElementById("name").value;ws = new WebSocket("ws://192.XXX.XXX.XXX:1234/" + name);//構件一個發送消息框var context = '<div class="sendMsg">\n' +' 輸入發送內容:<input id="sendWebMsg" />' +' <button onclick="javascript:sendMsgToWS()">發送</button>' +' </div>';document.getElementById("sendDiv").innerHTML = context;ws.onmessage = function (evt){var received_msg = evt.data;alert("接收到數據:" + received_msg);};ws.onclose = function(){ // 關閉 websocketalert("連接已關閉..."); };}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>服務端關鍵代碼:
#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 << "格式錯誤";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
?
總結
以上是生活随笔為你收集整理的Qt文档阅读笔记-构造WebSocket服务端的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Leaflet工作笔记-多个标签在地图显
- 下一篇: Spring Boot笔记-IDEA使用