当前位置: 首页 > 科技观察

带你了解WebSocket技术

时间:2023-03-19 01:14:51 科技观察

在WebSocket规范提出之前,开发者基本上使用两种轮询方式来实现实时功能:轮询(polling)和Comet技术。轮询:轮询技术要求客户端以设定的时间间隔周期性地向服务器发送请求,并经常检查是否有新的数据变化。显然,这种做法会导致不必要的请求过多,浪费流量和服务器资源。Comet技术可分为:longpolling、streaming技术。长轮询改进了上述轮询技术并减少了无用的请求。它会对一些数据设置一个过期时间,当数据过期时会向服务器发送请求;这种机制适用于数据变化不是特别频繁的情况。Streaming技术**是指客户端使用隐藏窗口与服务器建立HTTP长连接,服务器会在主动向客户端推送数据前不断更新连接状态以保持HTTP长连接存活。缺点:这两种技术的每次请求和响应都会在同一个头信息上浪费一定的流量,开发复杂度也比较大。随着HTML5推出的WebSocket,B/S模式具备了C/S模式的实时通信能力。WebSocket连接本质上是一个TCP连接,不需要每次传输都携带重复的header数据。WebSocket的工作流程:浏览器通过JavaScript向服务器发送请求建立WebSocket连接。WebSocket连接建立成功后,客户端和服务端就可以通过TCP连接传输数据了。WebSocket和TCP的关系,HTTPWebSocket和http协议都是基于TCP的可靠协议。WebSocket在建立握手连接时,通过http协议传输数据,但是建立连接后,真正的数据传输阶段就不需要http了。参与协议。从下图可以清楚的看出websocket通信的原理,分为三个阶段:Openhandshake数据传输Closehandshake下图展示了WebSocket的主要三个步骤。浏览器和服务器分别做这些事情。websocket的优缺点a)、服务端和客户端交换的header信息很小,只有2个字节左右;b)、客户端和服务端可以主动向对方传输数据;c)、Websocket是http协议的升级版,支持持久连接,只需要一次握手。不频繁的创建TCP请求和销毁请求,减少对网络带宽资源的占用,节省服务器资源;Springbootwebsocket实现引入依赖org.springframework.bootspring-boot-starter-websocket创建一个扩展TextWebSocketHandler或BinaryWebSocketHandler的WebSockethandler,你可以覆盖指定的方法。当Spring接收到WebSocket事件时,会自动调用该事件对应的方法。packagecom.ganhuojun.websocket.spring;importorg.springframework.stereotype.Component;importorg.springframework.web.socket.CloseStatus;importorg.springframework.web.socket.WebSocketHandler;importorg.springframework.web.socket.WebSocketMessage;importorg.springframeweb.socket.WebSocketSession;@ComponentpublicclassMySpringWebSocketHandlerimplementsWebSocketHandler{/***连接建立后触发的回调*/@OverridepublicvoidafterConnectionEstablished(WebSocketSessionwebSocketSession)throwsException{System.out.println("springlink"+webSocketSession.get**Id());}/*接收消息时触发的回调*/@OverridepublicvoidhandleMessage(WebSocketSessionwebSocketSession,WebSocketMessagewebSocketMessage)throwsException{}/***发送消息错误时触发的回调*/@OverridepublicvoidhandleTransportError(WebSocketSessionwebSocketSession,Throwablethrowable)throwsException{}*Callback断开连接后触发*/@OverridepublicvoidafterConnectionClosed(WebSocketSessionwebSocketSession,CloseStatuscloseStatus)throwsException{}/***是否处理碎片消息*/@OverridepublicbooleansupportsPartialMessages(){returnfalse;}}配置WebSocket注册包添加WebSocket处理器com.ganhuojun.websocket.spring;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework。web.socket.config.annotation.EnableWebSocket;importorg.springframework.web.socket.config.annotation.WebSocketConfigurer;importorg.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;@Configuration@EnableWebSocketpublicclassSpringWebSocketConfigimplementsWebSocketConfigurer{@OverridepublicvoidregisterWebSocketHandlers(WebSocketHandlerRegistryregistry){//spring默认会给一个OriginHandshakeInterceptor的拦截器//所以需要setAllowedOrigins,否则websocket返回403registry.addHandler(springWebSocketHandler(),"/spring/websocket").setAllowedOrigins("*");}@BeanpublicMySpringWebSocketHandlerspringWebSocketHandler(){WebreturnnewHandMySpring);}}前端可以自己写js代码,本文直接使用websocket在线调试工具http://www.websocket-test.com/如下图所示,根据前面的后端代码,测试后端日志

最新推荐
猜你喜欢