WebSocket实现实时通信
什么是websocket
- WebSocket是HTML5下一种新的协议(websocket协议本质上是一个基于tcp的协议)
- 它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯的目的
- Websocket是一个持久化的协议
websocket的原理
- websocket约定了一个通信的规范,通过一个握手的机制,客户端和服务器之间能建立一个类似tcp的连接,从而方便它们之间的通信
- 在websocket出现之前,web交互一般是基于http协议的短连接或者长连接
- websocket是一种全新的协议,不属于http无状态协议,协议名为"ws"
websocket与http的关系

相同点:
都是基于tcp的,都是可靠性传输协议
都是应用层协议
不同点:
WebSocket是双向通信协议,模拟Socket协议,可以双向发送或接受信息
HTTP是单向的
WebSocket是需要浏览器和服务器握手进行建立连接的
而http是浏览器发起向服务器的连接,服务器预先并不知道这个连接
联系:
WebSocket在建立握手时,数据是通过HTTP传输的。但是建立之后,在真正传输时候是不需要HTTP协议的
总结(总体过程):
首先,客户端发起http请求,经过3次握手后,建立起TCP连接;http请求里存放WebSocket支持的版本号等信息,如:Upgrade、Connection、WebSocket-Version等;
然后,服务器收到客户端的握手请求后,同样采用HTTP协议回馈数据;
最后,客户端收到连接成功的消息后,开始借助于TCP传输信道进行全双工通信。
WebSocket有以下特点
- 是真正的全双工方式,建立连接后客户端与服务器端是完全平等的,可以互相主动请求。而HTTP长连接基于HTTP,是传统的客户端对服务器发起请求的模式。
- HTTP长连接中,每次数据交换除了真正的数据部分外,服务器和客户端还要大量交换HTTP header,信息交换效率很低。Websocket协议通过第一个request建立了TCP连接之后,之后交换的数据都不需要发送 HTTP header就能交换数据,这显然和原有的HTTP协议有区别所以它需要对服务器和客户端都进行升级才能实现(主流浏览器都已支持HTML5)
websocket模拟聊天对话的功能
原理很简单,有点像VUE中的EventBus,用emit和on传来传去
下面是一个简单的 WebSocket 实现实时通讯
示例:
1.首先创建一个 WebSocket 对象:
const socket = new WebSocket('ws://localhost:8080');
2.在 WebSocket 对象的 open 事件中,可以编写客户端连接成功后执行的代码:
socket.addEventListener('open', (event) => {
console.log('WebSocket 连接成功!');
});
3.在 WebSocket 对象的 message 事件中,可以编写客户端接收消息后执行的代码:
socket.addEventListener('message', (event) => {
console.log('接收到的消息:', event.data);
});
4.在 WebSocket 对象的error事件中,可以编写发生连接错误后执行的代码:
socket.addEventListener('error', (event) => {
console.log('WS连接错误:', event.data);
});
5.在 WebSocket 对象的close事件中,可以编写发生连接错误后执行的代码:
socket.addEventListener('close', (event) => {
console.log('关闭WS连接后的事件:', event.data);
});
6.使用 WebSocket 对象的 send 方法可以向服务器发送消息:
socket.send('Hello, WebSocket!');
7.在服务器端,需要使用特定的 WebSocket 框架来处理客户端的连接和消息。例如,在 Node.js 中,可以使用 ws 模块来实现 WebSocket 服务器:
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });
wss.on('connection', (socket) => {
socket.on('open', () => {
console.log('有新的客户端建立连接!');
});
socket.on('message', (message) => {
console.log('接收到客户端的消息:', message);
// 处理消息逻辑
// ...
// 发送消息给客户端
socket.send('Hello, WebSocket Client!');
});
socket.on('error', () => {
console.log('WS连接发生错误!');
});
socket.on('close', () => {
console.log('客户端断开连接!');
});
});
常用websocket开源库
1、GoEasy
GoEasy是一款在国内比较流行的websocket开发框架,目前GoEasy提供完整的websocket前后端解决方案。据了解,GoEasy目前支持比较多的前端技术/框架比如小程序、react、vue、uniapp等的消息发送和接收,另外还支持php、java、python等服务端语言通过调用Restful API实现服务端的消息推送。有websocket使用需求的开发者可以来注册GoEasy账号进行测试使用。
2、noPoll
noPoll 是一个 WebSocket 的开源实现,使用 ANSI C 编写,可用于构建纯 WebSocket 解决方案和为已有的面向 TCP 的应用程序提供 。
项目主页:http://www.aspl.es/nopoll/
3、Wslay
Wslay 是一个用 C 语言实现的 WebSocket 开发库。实现了 RFC 6455 中描述的第 13 版本的协议。提供了基于事件的 API 和基于帧的底层 API。特别适合非堵塞的 reactor 模式风格应用。可在不同的事件中设置回调。Wslay 只支持 WebSocket 协议的数据传输部分,不执行 HTTP 的握手过程。
项目主页:https://tatsuhiro-t.github.io/wslay/tutorial.html
4、libwebsockets
libwebsockets是一款轻量级用来开发服务器和客户端的C库。按照官方给出的介绍来看,它不仅支持ws,wss还同时支持http与https,可以轻轻松松结合openssl等库来实现ssl加密。
项目主页:https://libwebsockets.org/
5、websocket++
WebSocket++ 是一个只包含 C++ 头文件的 WebSocket 的 C++ 开发包,实现了 RFC 6455 也就是 WebSocket 协议。可以在 C++ 应用中实现 WebSocket 客户端和服务器端功能。使用可交换的网络传输模块,包括 C++ iostreams 和 Boost Asio。
项目主页:https://github.com/zaphoyd/websocketpp
6、uWebSockets
uWebSockets,µWS (“microWS”) 是一个客户端和服务器的 WebSocket 和 HTTP 实现。它简单、高效且轻量级。
这个库在底层依赖于 libuv 库,作为异步网络 I/O 库。
项目主页:https://github.com/uNetworking/uWebSockets
7、Poco Websocket
POCO C++ 库是一个跨平台的 C++ 网络库。其中包含了 WebSocket 的实现模块。Poco 库是一个比较强大,比较复杂的网络库。
项目主页:https://pocoproject.org/
8、Beast
基于 Boost.Asio 以 C++11 构建的 HTTP 和 WebSocket 库。Boost 项目的 HTTP 和 WebSocket 库。
项目主页:https://www.boost.org/doc/libs/1_66_0/libs/beast/doc/html/index.html
可参考
https://blog.csdn.net/lizhichengwei/article/details/129246446

浙公网安备 33010602011771号