WebSocket实现实时通信

 

什么是websocket

  • WebSocket是HTML5下一种新的协议(websocket协议本质上是一个基于tcp的协议)
  • 它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯的目的
  • Websocket是一个持久化的协议

websocket的原理

  1. websocket约定了一个通信的规范,通过一个握手的机制,客户端和服务器之间能建立一个类似tcp的连接,从而方便它们之间的通信
  2. 在websocket出现之前,web交互一般是基于http协议的短连接或者长连接
  3. 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账号进行测试使用。

项目主页:https://www.goeasy.io/

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

posted @ 2023-03-16 13:46  泠风lj  阅读(765)  评论(0)    收藏  举报