目录

基本概念

代码与实例

程序打包下载


基本概念

因为周末搞了个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服务端相关推荐

  1. Qt文档阅读笔记-加载HeightMap(高度图)构造3D地形图

    Qt文档阅读笔记-加载HeightMap(高度图)构造3D地形图 QHeightMapSurfaceDataProxy:是Q3DSurface的一个基本代理类. 他是专门加载高度图. 高度图是没有X, ...

  2. Qt文档阅读笔记-共享库的创建与调用

    使用共享库的符号 这个符号可以作用在变量.类.函数中,并且这些都可以被调用端使用. 在编译共享库中,需要使用export符号.在使用端调用的时候使用import符号. 这里是本人从文档中记录的笔记,大 ...

  3. Qt文档阅读笔记-Rotations Example相关

    Rotations Example文档阅读笔记 使用这种方式,对y轴和z轴进行旋转. QQuaternion yRotation = QQuaternion::fromAxisAndAngle(0.0 ...

  4. Qt文档阅读笔记-Fortune Client Example实例解析

    目录 官方解析 实例代码 博主增加解析 官方解析 Fortune Client Example 以使用QTcpSocket为例子,服务端可以配合Fortune Server或Threaded Fort ...

  5. Qt文档阅读笔记-QWebEngineView及QML WebEngineView

    这里主要是最近有给Java Web项目及Qt项目需要混合,自己搞的QtWebEngine没有问题,而用了项目里面的,就有问题,在此阅读下官方资料,看看能不能解决这样莫名其妙的问题,在此记录下本次的阅读 ...

  6. Qt文档阅读笔记-moc工具使用及其理论(moc工具如何添加到makefile中)

    moc(Meta-Object Compiler):用于处理Qt中关于C++的扩展. moc工具读取C++头文件,看看这个头文件里面的类是不是包含Q_OBJECT宏,它会将这个头文件,转换为带有met ...

  7. Qt文档阅读笔记-对Style Plugin Example实例的解析

    目录 前言 Style Plugin Example SimpleStylePlugin Class 定义 SimpleStylePlugin Class 实现 main()函数 The Simple ...

  8. Qt文档阅读笔记-QSet官方解析及实例

    目录 官方解析 博主栗子 官方解析 QSet类是一个模板类,他是一个哈希表集合. QSet<T>是Qt的一个普通容器类.QSet存储的值是不指明顺序的,QSet对这些值提供了快速检索的功能 ...

  9. Qt文档阅读笔记-QML Canvas的官方解析及实例

    目录 官方解析 博主例子 官方解析 Canvas可以用于画直线或曲线,简单或复杂的形状,图形,图片,并且他能加文字,颜色,阴影,和颜色梯度,和其他的装饰,可以进行低像素操作.Canvas可以保存成图像 ...

最新文章

  1. mysql 5.7笔记_关于MySql 5.7.29免安装版本的一个笔记
  2. 了解下C# 类(Class)
  3. 4种方法可以缓解网络瓶颈
  4. Excel宏的易错点
  5. 【音视频安卓开发 (六)】Android GLSurfaceView播放视频
  6. Volume group VolGroup00 not found
  7. Java项目课程06:系统实现-数据库
  8. linux读取扇区内容,linux-device-driver
  9. unity3D ——自带寻路Navmesh入门教程(一)(转)
  10. HtmlCleaner CleanerProperties 参数配置(转自macken博客,链接:http://macken.iteye.com/blog/1579809)...
  11. OpenCV单目平面测距
  12. iOS 跑马灯带图片可点击
  13. 公司部门英文缩写简称收集
  14. AD9173/AD9689 FMC采集板卡调试记录
  15. 10个最好的免费FTP客户端
  16. 三年级计算机老师个人总结,三年级计算机教学工作总结
  17. 牛客网之黑暗的字符串
  18. 单招计算机英语面试口语,英语面试口语对话技巧:教育背景
  19. vue项目,h5图片放大后,支持手指缩放功能
  20. 计算机实验员技能大赛,“迎接挑战”计算机技能大赛圆满结束!

热门文章

  1. LNMP实现服务器轮询负载均衡
  2. 装箱(Boxing)和拆箱(Unboxing)
  3. HR怎么从面试中了解程序员的真实水平?需要面试的程序员,注意了!
  4. 学会这两招,快速突出图表重点,让老板眼前一亮
  5. 看完这篇你就明白,为什么说大部分企业建设数据中台都会失败?
  6. D5SJ醴陵 2013最新版
  7. 在和人相处时的即时通讯软件
  8. 遍历ArrayList易犯错误
  9. 一个简单的学生成绩管理软件(ODBC开发)
  10. python之线程,不得不了解的硬知识!