WebSocket:实现实时互动、数据推送的利器,你了解多少

这篇具有很好参考价值的文章主要介绍了WebSocket:实现实时互动、数据推送的利器,你了解多少。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

WebSocket技术是一种基于TCP协议的全双工通信协议,它允许浏览器和服务器之间进行实时、双向的通信。相比传统的HTTP请求-响应模式,WebSocket提供了持久连接,可以实时地推送数据,减少了通信的延迟。

WebSocket的工作原理是通过建立一条持久连接来实现实时通信。首先,浏览器和服务器进行一次标准的HTTP握手,建立连接。随后,连接升级为WebSocket协议,之后就可以在连接上发送和接收消息,实现双向通信。

WebSocket的应用非常广泛。以下是几个典型的应用场景:

即时通讯:WebSocket可用于实现聊天应用、在线客服系统等,用户可以实时地发送和接收消息。

实时数据展示:通过WebSocket可以实时地推送数据给前端,比如实时股票行情、实时天气更新等。

多人游戏:WebSocket可以实现多人在线游戏,玩家可以实时地进行交互、通信。

实时协作:比如实时协同编辑器,多个用户可以同时编辑一个文档,并实时地看到其他用户的操作。

数据监控:WebSocket可以用于实时监控系统的运行状态、日志更新等,便于及时发现和解决问题。

使用WebSocket技术也需要考虑一些方面:

浏览器和服务器的兼容性:不是所有浏览器都完全支持WebSocket,需要进行兼容性测试和处理,可能需要对不支持的浏览器使用其他技术(如轮询或长轮询)来进行实时通信。

负载均衡和扩展性:如果应用需要处理大量的并发连接,需要考虑负载均衡和扩展性,可以使用多个WebSocket服务器配合负载均衡器来实现。

总结起来,WebSocket技术提供了一种实时、双向通信的方式,适用于各种需要实时交互和实时数据推送的应用场景。它使得Web应用能够更加实时、高效地进行通信,提供了更好的用户体验。

虽然WebSocket只需要建立一次就可以让客户端和服务端建立起连接,但是因为是基于TCP协议构建的,所以本质上还是要进行三次握手。

TCP本身是持久连接,三次握手和四次挥手就不老调重弹了。而HTTP之所以是单向的,是因为规范规定了服务器只能响应请求,而不能主动发送数据。所以说WebSocket可以看做是HTTP的一个补丁

协议概览

WebSocket协议在游览器中的显示是这样的:

websocket实时通信,websocket,java,后端

我们可以看到不同于一般的请求,WebSocket URL前缀为ws,它告诉游览器自己不是HTTP请求,而是WebSocket请求,此时游览器便会自动对协议进行升级。

默认ws端口是80,wss端口是443。

wss就是通过TLS加密后的ws。

不同于一般的HTTP请求,WebSocket请求添加了几个字段来作为应用,主要的有:

Sec-WebSocket-Accept和Sec-WebSocket-Key:只有当Sec-WebSocket-Key的值经过固定算法加密后的数据和响应头里的Sec-WebSocket-Accept的值保持一致,该连接才会被认可建立,避免跨协议攻击。 Sec-WebSocket-Version:这个header字段的值必须为13,因为在它之前有很多测试的版本,比如9、10、11、12,这些版本现在都不被认为是有效的Sec-WebSocket-Version。 Sec-WebSocket-Extensions:该属性存储客户端的扩展,在连接建立时服务端可以针对该扩展进行处理。 Upgrade:告诉游览器该HTTP协议已经升级到了WebSocket。

当客户端对服务端发起WebSocket请求时,只有在当前连接已经建立的情况下才能再次建立连接(客户端会对剩下的连接进行排序)。因为WebSocket是长连接,所以客户端需要注意限制同一个主机的连接数量,避免脚本通过创建大量的WebSocket连接来进行DDOS攻击。如果客户端是通过代理访问服务的,那么客户端应该连接到那个代理并且通过这个代理去和服务端建立一个TCP连接。

在服务端接收客户端的WebSocket请求后,需要对该请求进行解析,获取它的Sec-WebSocket-Key、Sec-WebSocket-Version、Sec-WebSocket-Extensions,还有客户端的源地址、请求的资源名称等。当解析完成后,如果能与服务端连接,那么服务端将会返回给客户端一个响应,响应里面包含Sec-WebSocket-Accept,这是与客户端对接的标识符。

当客户端与服务端建立好连接后,两者就可以通信了:

websocket实时通信,websocket,java,后端

协议结构

WebSocket协议的全局结构大概如下所示,我们来大概解析一下它各个字段的含义:

websocket实时通信,websocket,java,后端

FIN:表示这是消息的最后一个字段(设置为1,默认为0)。

RESV1/RESV2/RESV3:标识是否有扩展协议,如果为1,那么在EXTEND PAYLOAD为0的情况下,就会断开WebSocket连接。

OPCODE:标识操作码,这是一个操作帧,用来指示WebSocket的动作。默认的标识码有:

%x0 :一个连续的消息分片 %x1 :一个文本类型的消息分片 %x2 :一个二进制类型的消息分片 %x3-7:预留给以后的数据帧 %x8 :一个关闭连接的指令 %x9 :一个ping包 %xA :一个pong包 %xB-F:预留给以后的控制帧

ping包和pong包是用来做心跳检测的。

MASK:标识数据是否有加掩码,如果设置为1,掩码键必须放在MASKING KEY区域。

PAYED LENGTH:传输的数据的长度(不包括MASKING-KEY)。

MASKING-KEY:掩码键。

PAYLOAD DATA:传输的数据(扩展数据EXTEND PAYLOAD+应用数据APPLICATION PAYLOAD)。

扩展数据:自己定义的扩展协议。 应用数据:基础的数据帧。 前端处理

HTML5封装好了处理方法,只需要调用其API就可以了。

直接创建一个WebSocket对象,然后将onopen\onclose等方法绑定到对象。

相关API可以查看MDN WEB——API WebSocket。

后端处理

用Netty的WebSocketServerProtocolHandler举例,当我们创建WebSocket服务时,必然要加入一个WebSocket协议的处理器,将其协议内容封装为一个便于使用的包装类,在Netty中,我们可以这样定制WebSocket服务:

websocket实时通信,websocket,java,后端

进入WebSocketServerProtocolHandler类,可以看到它定义的属性有:

websocket实时通信,websocket,java,后端它两个方法有:

一个是handlerAdded,它会在Channel连接后回调,每次都会插入WebSocketServerProtocolHandshakeHandler。

websocket实时通信,websocket,java,后端

一个是decode,它会针对进行的数据帧进行操作。

websocket实时通信,websocket,java,后端

在close前要进行frame.retain();,是因为在关闭时需要用到frame,在Netty的所有操作都是异步的情况下,这样就可以防止frame在没有用完时就被释放掉了。

来看下WebSocketServerProtocolHandshakeHandler.channelRead方法:

websocket实时通信,websocket,java,后端

在WebSocketServerProtocolHandshakeHandler.channelRead绑定触发事件时,为了保持兼容性,所以设置了两个,第一个是过时的,下面那个是新的。

对于通过握手器工厂WebSocketServerHandshakerFactory创建的WebSocketServerHandshaker,我们需要注意它的handshake方法。该方法其实就是来发送响应数据的。

它先把跟HTTP聚合,压缩的处理器移除,然后看有没有HttpRequestDecoder,如果没有,那就在前面添加WebSocket的编解码器。如果有HTTP编解码器,就把编解码器替换成WebSocket编解码器,等发送响应成功了,就移除掉HttpServerCodec或HttpResponseEncoder。

websocket实时通信,websocket,java,后端

这样处理完之后,就把和HTTP编解码器移除出去了,这样的话就可以保证使用者即使添加了错误的处理器,程序也可以正常执行WebSocket连接。

总结

WebSocket协议用于长连接传输数据,本质也不过是定义了一种协议格式,然后往里面放数据。从功能上来说唯一和HTTP的区别就是客户端和服务端是可以相互推送消息的,而非被动。

之前说过HTTP 1.1添加了一个keep-alive请求头属性,可以作用于长连接。但是这里的长连接和WebSocket的长连接不同。keep-alive的作用是保持连接,可以让其它的HTTP请求可以复用这个通道,每次HTTP请求还是要携带请求头的。而WebSocket的长连接的每一个连接对应一个客户端。

一个很明显的比方就是打电话给客服。keep-alive的表示是一方讲完之后就把电话给了自己身后的人,然后身后的人跟客服反映新的问题。WebSocket表示一方讲完之后,听完客服的反馈就挂掉了电话,两人就断了联系。文章来源地址https://www.toymoban.com/news/detail-800786.html

到了这里,关于WebSocket:实现实时互动、数据推送的利器,你了解多少的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 实现实时互动:用Spring Boot原生WebSocket打造你的专属聊天室

    😊 @ 作者: 一恍过去 💖 @ 主页: https://blog.csdn.net/zhuocailing3390 🎊 @ 社区: Java技术栈交流 🎉 @ 主题: 实现实时互动:用Spring Boot原生WebSocket打造你的专属聊天室 ⏱️ @ 创作时间: 2023年08月04日 WebSocket 实现聊天室的原理包括建立 WebSocket 连接的握手过程、保持连接状态以

    2024年02月10日
    浏览(41)
  • websocket实时推送统计数据给前端页面

    前提须知:websocket基本使用 业务场景,每秒推送统计数据给前端页面,分别显示前天,昨天,今天的前十名客户数据 @ServerEndpoint(\\\"/smsMCustomerStaTop10Ws\\\") 定义推送数据给到具体的连接标识 以上 onOpen() 方法最终触发的业务方法 smsMonitorService.pushSmsMCustomerStaTop10(); 以上 smsMonitorMapper.findSm

    2024年02月15日
    浏览(29)
  • websocket多实例推送解决方案-数据实时展示

    需求 需要前端展示实时的订单数据信息。如下图所示,实时下单实时页面统计更新展示   思路方案 前端使用websocket 建立通信   后端监听数据库的binglog变更,实时得到最新数据,推送到前端  现状及问题 客户端想实现实时获取数据的变更,使用了websocket+kafkaMq,当数据库变

    2024年02月03日
    浏览(31)
  • 记录--你还在使用websocket实现实时消息推送吗?

    在日常的开发中,我们经常能碰见服务端需要主动推送给客户端数据的业务场景,比如数据大屏的实时数据,比如消息中心的未读消息,比如聊天功能等等。 本文主要介绍SSE的使用场景和如何使用SSE。 我们常规实现这些需求的方案有以下三种 轮询 websocket SSE 在很久很久以前

    2024年02月19日
    浏览(29)
  • SpringBoot集成WebSocket实现消息实时推送(提供Gitee源码)

    前言:在最近的工作当中,客户反应需要实时接收消息提醒,这个功能虽然不大,但不过也用到了一些新的技术,于是我这边写一个关于我如何实现这个功能、编写、测试到部署服务器,归纳到这篇博客中进行总结。 目录 一、什么是WebSocket 二、后端实现 2.1、引入pom.xml依赖

    2024年02月11日
    浏览(34)
  • Spring Boot进阶(48):【实战教程】SpringBoot集成WebSocket轻松实现实时消息推送

            WebSocket是一种新型的通信协议,它可以在客户端与服务器端之间实现双向通信,具有低延迟、高效性等特点,适用于实时通信场景。在SpringBoot应用中,集成WebSocket可以方便地实现实时通信功能,如即时聊天、实时数据传输等。         本文将介绍如何在Sprin

    2024年02月09日
    浏览(37)
  • 如果让你实现实时消息推送你会用什么技术?轮询、websocket还是sse

    在日常的开发中,我们经常能碰见服务端需要主动推送给客户端数据的业务场景,比如_数据大屏的实时数据_,比如_消息中心的未读消息_,比如_聊天功能_等等。 本文主要介绍SSE的使用场景和如何使用SSE。 学习就完事了 我们常规实现这些需求的方案有以下三种 轮询 websock

    2024年03月19日
    浏览(33)
  • SpringBoot集成WebSocket(实时消息推送)

    🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢迎点赞 👍 收藏 ⭐留言 📝 🍓 更多文章请点击 调试工具 :http://coolaf.com/tool/chatt

    2024年04月29日
    浏览(30)
  • Redis的发布订阅模式:实现消息队列和实时数据推送的利器

    当涉及到实时数据推送和消息队列时,Redis的发布订阅模式是一种非常有用的工具。Redis是一个开源的内存数据库,被广泛用于缓存、队列和实时数据处理等方面。 在本博客中,我们将重点介绍Redis的发布订阅模式,并且提供一些示例代码来帮助读者更好地理解这个模式以及如

    2024年02月12日
    浏览(82)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包