WebScoket

  • 服务端
    • 特点
      • (1)建立在 TCP 协议之上,服务器端的实现比较容易,是一个可靠的传输协议。
      • (2)与 HTTP协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。
      • (3)数据格式比较轻量,性能开销小,通信高效,长链接,不像短连接多次交互会一直存在打开、关闭协议存在性能开销
      • (4)可以发送文本,也可以发送二进制数据。
      • (5)没有同源限制,客户端可以与任意服务器通信。
      • (6)协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。
    • 实现
      • 1,pom依赖
      • 2,配置WebSocketConfig
        • 开启WebScoket支持,配置WebSocket消息代理和处理器
        • 添加一个WebSocket端点
          • 可以用使用SockJS作为传输协议
          • 使用Stomp方式添加webscoket站点
            • 如果不配置的就是使用webscoket的原生方式
        • 将ServerEndpointExporter注册到Spring容器管理中
          • 是Spring框架中用于支持WebSocket的组件之一
          • 它负责将WebSocket端点(endpoint)注册到服务器上,以便能够处理客户端的WebSocket连接请求。
      • 3,创建一个WebSocket控制器和前端交互
        • onOpen:客户端与服务端建立连接就会触发该动作
        • onClose: 客户端关闭浏览器或者刷新页面,会触发服务端该动作
        • onMessage: 客户端主送推送消息
          • 允许有返回值,可以和客户端通过返回值交互
        • onError: 客户端发送异常
    • 概念(一次握手,全双工(可以理解双向)通信)
      • 服务端响应:服务器收到客户端发来的心跳包后,会回复一个确认消息,表明已经收到了心跳并确认连接的正常性。如果服务器在一定时间内没有收到客户端的心跳,或者客户端没有收到服务器的确认消息,那么可以判断连接可能已经断开。
      • 心跳参数设置:心跳的时间间隔是可配置的,根据不同的应用场景和需求,开发者可以调整心跳频率以平衡实时性和资源消耗。
      • 与HTTP的区别
        • http是短链接,请求之后会关闭连接,http通信是单向的,基于请求响应模式;WebSocket支持双向通信
          • 相同之处:底层都是TCP
        • WebSocket是长连接,只需要通过一次请求初始化连接,然后所有的请求和响应都是通过这个TCP连接进行通信。
        • 总结:如果要频繁(如每5秒交互一次)的和服务端交互,Http比webscoket更吃应用
          • 延迟和效率:由于WebSocket的长连接特性,减少了建立连接的开销,同时双向通信也减少了数据传输的次数。这使得WebSocket在实时通信和即时更新的场景中更具优势。相比之下,HTTP协议在每次请求和响应时都需要进行握手和头部信息的传输,这会增加通信的延迟。
          • 控制开销:WebSocket具有较少的控制开销,与每次都要携带完整头部的HTTP请求相比,此项开销有显著减少。
          • 实时性:由于协议是全双工的,所以服务器可以随时主动给客户端下方数据。这使得WebSocket的延迟明显更小。即使和Comet等类似的长轮询相比,其也能在短时间内更多次地传递数据。而HTTP请求需要等待客户端发起请求,服务端才能响应,与其相比,WebSocket的实时性更强。
          • 保持连接状态:与HTTP请求不同的是,WebSocket需要先创建连接,这是其成为一种有状态的协议,之后通信时可以省略部分状态信息。而HTTP请求可能需要在每个请求中都携带状态信息(如身份认证等)。
          • 二进制支持:WebSocket定义了二进制帧,与HTTP请求相比,可以更轻松地处理二进制内容。
          • 缓存:HTTP协议支持缓存,可以减少服务器的负载,提高响应速度。
          • 可靠性:HTTP协议使用TCP协议作为传输层协议,具有可靠性高的特点。
      • 与socket的区别
        • WebSocket拥有完整的应用层协议,包含一套标准的API
        • Socket是一组接口,是应用层与TCP/IP协议通信的中间软件抽象层
      • HTML5的一种新的协议,WebSocket是真正实现了全双工通信的服务器向客户端的互联网技术,是单个TCP连接上进行全双工通信的协议。
      • 应用场景
        • 假设现在需要设计一个实时预警系统的通知模块,那么作为工程师我们应该怎么设计通知的这个功能呢?因为这些系统的数据来源,一般他通过硬件设备采集到后台的,如果我们现在只有 http 协议,那么我们只能让客户端不断地轮询服务器,轮询的时间间隔越小越能接近实时的效果。可是,轮询的效率低,又浪费资源。针对这样的场景,websocket 应运而生。
    • spring和Stomp的关系
      • 当使用 Spring 实现 STOMP 时,Spring WebSocket 应用程序充当客户端的 STOMP 代理。消息被路由到 @Controller 消息处理方法,或路由到一个简单的内存代理,经过处理后,发送给订阅用户。
      • 另外,还可以配置 Spring 使用专用的 STOMP 代理(例如RabbitMQ,ActiveMQ 等)来实际传播消息。在这种情况下,Spring 维护代理(MQ系统)的 TCP 连接,将消息转发给它,并将消息传递给连接的 WebSocket 客户端。
  • Web
    • 客户端心跳:定时向服务器发送心跳数据包,通常是一些轻量级的数据,如简单的JSON对象。这个过程中,客户端设置一个定时器,在指定的时间间隔后自动发送心跳包到服务器。
    • 重连机制:在心跳检测发现连接异常时,可以触发重连机制。客户端会尝试重新与服务器建立WebSocket连接,恢复通讯。
    • html5WebScoket和Stomp的关系
      • WebSocket 是底层协议,STOMP 是适用于WebSocket 的上层协议。直接使用 WebSocket 就类似于使用 TCP 套接字来编写 web 应用,没有高层协议定义消息的语意,不利于开发与维护。同HTTP在TCP套接字上添加请求-响应模型层一样,STOMP在 WebSocket之上提供了一个基于帧的线路格式层,用来定义消息语义
      • 案例
        • Stomp封装结构
          • var socket = new SockJS('/websocket'); var stompClient = Stomp.over(socket);
        • 原生的webscoket请求
          • document.addEventListener('DOMContentLoaded', function () { var socket = new WebSocket('ws://' + window.location.host + '/websocket');
  • 认证问题
    • WebSocket本身对“身份认证”并没有提供直接的支持,对客户端的连接默认是“来者不拒”,所以认证授权这个事,需要自己动手。在建立WebSocket连接之前,客户端需要先通过HTTP协议进行身份认证,并在服务器端生成一个Session ID。然后,客户端在建立WebSocket连接时,将Session ID作为Cookie发送给服务器端,服务器端可以根据Session ID验证客户端的身份。
  • webscoket订阅心跳主题和发送心跳消息有什么区别
    • 订阅心跳主题:客户端通过订阅一个特定的心跳主题,可以接收服务器定期发送的心跳消息。这种方式下,服务器会将心跳消息发送给所有订阅了该主题的客户端。
    • 发送心跳消息:客户端主动向服务器发送心跳消息,以告知服务器自己仍然在线。这种方式下,客户端需要定期向服务器发送心跳请求,而服务器则负责响应这些请求。
    • 总结:订阅心跳主题是客户端被动接收服务器的心跳消息,而发送心跳消息是客户端主动向服务器发送心跳请求。(全双工)
      • 消息订阅的方便主要在于其他客户端可以订阅该主题并接收到服务端返回的消息数据
  • Stomp协议
    • 在使用STOMP协议封装的WebSocket时,不需要显式设置端口号,是因为STOMP本身是一种消息协议,它并不直接处理底层的网络连接细节。
      • 一种简单的文本导向的消息传递协议,它定义了客户端和消息代理之间进行交互的帧格式和语义。STOMP设计的初衷是为了简化消息传递的复杂性,使得不同的消息系统之间能够更容易地进行互操作。
    • 抽象层:STOMP提供了一种高级的抽象层,允许应用程序发送和接收消息,而不必关心底层的网络连接细节。这意味着使用STOMP时,开发者不需要直接处理WebSocket的URL和端口号等细节。
    • 适配器和中间件:在实际应用中,STOMP通常与消息代理服务器一起使用,如RabbitMQ。这些消息代理服务器提供了对STOMP协议的支持,并且可以处理底层的WebSocket连接。因此,端口号通常是在配置消息代理服务器时设置的,而不是在应用层面直接设置。
    • 封装和抽象:有些框架或库可能提供了对WebSocket的封装,这些封装隐藏了底层的细节,包括端口号的配置。这样,开发者就可以专注于业务逻辑,而不必担心网络通信的具体实现。
    • WebSocket的工作机制:WebSocket协议本身允许浏览器和服务器之间建立持久性的连接,一旦握手完成,双方可以直接进行双向数据传输,而无需频繁地重新建立连接。STOMP正是利用了这一点,使得消息传递更加高效。
  • 应用场景
    • 视频弹幕
    • 网页聊天
    • 体育实况更新
    • 股票基金报价实时更新
    • 客户端的埋点退出机制、实时监听等
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

、小H

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值