socket 实现前后端

2023/04/12 功能实现 共 1865 字,约 6 分钟

socket 实现前后端实时通信,当数据搬运工

WebSocket和Socket的区别

WebSocket和Socket都是网络编程中使用的通信协议,但是它们之间有几个主要区别:

WebSocket是一种基于HTTP的协议,而Socket则是一种完全独立的协议。

WebSocket是建立在同一个TCP连接上的双向通信协议,而Socket则是一种面向流的协议,需要建立连接、传输数据和关闭连接。

WebSocket可以通过HTTP代理和防火墙进行通信,而Socket则需要特殊的端口和IP地址才能与外部通信。

WebSocket主要用于实时互动应用程序,如聊天室、在线游戏等,而Socket则更适合于客户端和服务器之间长时间的、高并发的数据交互,如网络爬虫、视频流传输等。

webscoket的连接原理

WebSocket是HTML5的一个新协议,它实现了浏览器和服务器全双工(full-duplex)通信,使得服务器可以主动向客户端推送数据,而不是依靠客户端不断地向服务器发起请求。基于Socket完成了握手后, 客户端和服务器端之间就形成了一条可用的双向通信的通道,双方可以通过这条通道进行数据传输。

客户端向服务器发起WebSocket连接请求,这个请求与普通的HTTP请求不同,其特点包括:

使用的协议是ws://或wss://(加密连接)

请求头中带有Upgrade字段,值为websocket

请求头中带有Connection字段,值为Upgrade

请求头中带有Sec-WebSocket-Key字段,该值是一个随机字符串,用于保证连接的安全性

服务器处理WebSocket连接请求,如果验证通过,则返回一个101 Switching Protocols的响应码,表示同意协议切换,否则返回错误信息。

客户端收到服务器返回的101 Switching Protocols响应码后,表示连接已建立。此时,客户端和服务器就可以进行全双工通信了。

数据传输。客户端和服务器通过建立的WebSocket通道,可以相互发送数据,无论是文本还是二进制数据,都可以进行传输。

总的来说,WebSocket是一种基于TCP协议实现的全双工通信协议,通过握手协议完成协议切换。WebSocket协议在遵守现有的互联网标准的基础上,兼顾了性能和可扩展性,在实际应用中具有很高的价值。

webSocket与传统的http相比有什么优势?

较低的延迟:在传统的HTTP请求-响应模式中,每次请求都需要建立新的连接,传输完成后再关闭连接。而在WebSocket中,客户端和服务器之间只需要建立一次连接,就可以保持通信状态,降低了建立连接的时间和延迟。

压缩头部信息:HTTP协议的头部信息较大,占用了很大的带宽和传输时间。而WebSocket协议的头部信息较小,只有几个字节,可以有效减少头部信息的传输时间和带宽,提高传输效率。

服务器可以主动发送消息:在传统的HTTP协议中,服务器只能在客户端发送请求后才能向客户端响应数据。而在WebSocket中,服务器可以随时发送消息给客户端,可以及时推送动态内容或状态。

节约带宽和服务器资源:在传统的HTTP协议中,客户端需要频繁地发送请求获取新的数据,每次请求都需要占用服务器资源。而在WebSocket中,客户端可以通过一次连接获取并保持服务器上的数据,减少了请求和服务器资源的占用。 由于WebSocket具有较低的延迟、高效的传输和双向通信等特点,越来越多的实时应用,如在线游戏、聊天室、股票报价等,采用了WebSocket协议来实现高效的传输和实时通信。

实现

Socket.IO 服务器 (Node.js) 和 Socket.IO 客户端(浏览器, Node.js 或 其他编程语言)之间的双向通道尽可能使用WebSocket 连接建立,并将使用 HTTP 长轮询作为后备

具体实现可参考如下文档

socket.io

nest Gateways

nest 在线demo

总的来说算是很简单了,读文档,就知道怎么跑一个简单的例子了

温馨提示:在nest项目中,如果一个项目有多个websocket实例,此时我们应该在 WebSocketGateway 装饰器中指定命名空间例如

 @WebSocketGateway({
  namespace: '/point',
})

这就意味着websocket网关只能出来来自该命名空间的链接,断开等事件。如果没有指定命名空间,多个实例在网关处会共用一套逻辑,不利于以后的处理

在客户端如果我们指定使用wss协议不用http协议时,需要在实例处指名transports


在技术的历史长河中,虽然我们素未谋面,却已相识已久,很微妙也很知足。互联网让世界变得更小,你我之间更近。

在逝去的青葱岁月中,虽然我们未曾相遇,却共同经历着一样的情愫。谁的青春不曾迷茫或焦虑亦是无奈,谁不曾年少过

在未来的日子里,让我们共享好的文章,共同学习进步。有不错的文章记得分享给我,我不会写好的文章,所以我只能做一个搬运工

我叫 sunseekers(张敏) ,千千万万个张敏与你同在,18年电子商务专业毕业,毕业后在前端搬砖

如果喜欢我的话,恰巧我也喜欢你的话,让我们手拉手,肩并肩共同前行,相互学习,互相鼓励

文档信息

Search

    Table of Contents