做任务的网站,深圳营销网站,站长网站提交,wordpress表结构写入不全目录
一、什么是Websocket
二、Websocket特点
三、WebSocket与HTTP的区别
四、常见应用场景
五、SpringBoot集成WebSocket
1. 原生注解
2. Spring封装 一、什么是Websocket WebSocket 是一种在单个 TCP 连接上进行 全双工 通信的协议#xff0c;它可以让客户端和服务器…
目录
一、什么是Websocket
二、Websocket特点
三、WebSocket与HTTP的区别
四、常见应用场景
五、SpringBoot集成WebSocket
1. 原生注解
2. Spring封装 一、什么是Websocket WebSocket 是一种在单个 TCP 连接上进行 全双工 通信的协议它可以让客户端和服务器之间进行实时的双向通信。WebSocket 使用一个长连接在客户端和服务器之间保持持久的连接从而可以实时地发送和接收数据。 在 WebSocket 中客户端和服务器之间可以互相发送消息客户端可以使用 JavaScript 中的 WebSocket API 发送消息到服务器也可以接收服务器发送的消息。
二、Websocket特点 简单来说websocket 具有双向通信实时性强支持二进制控制开销的特点。
协议标识符是ws如果加密则为wss服务器网址就是 URL。实时通信服务器可以随时主动给客户端下发数据。保持连接状态Websocket需要先创建连接所以是一种有状态的协议之后通信时就可以省略部分状态信息。控制开销连接创建后服务器和客户端之间交换数据时用于协议控制的数据包头部相对较小。在不包含扩展的情况下对于服务器到客户端的内容此头部大小只有2至10字节和数据包长度有关对于客户端到服务器的内容头部还需要加上额外的4字节的掩码。实现简单建立在 TCP 协议之上服务器端的实现比较容易并且没有同源限制客户端可以与任意服务器通信。支持二进制传输Websocket定义了二进制帧可以发送文本也可以发送二进制数据。与 HTTP 协议有着良好的兼容性。默认端口也是80和443并且握手阶段采用 HTTP 协议因此握手时不容易屏蔽能通过各种 HTTP 代理服务器。支持扩展用户可以扩展协议、实现部分自定义的子协议如部分浏览器支持压缩等。
三、WebSocket与HTTP的区别 websocket和http都是基于TCP的应用层协议使用的也是 80 端口若运行在 TLS 之上时默认使用 443 端口。 其区别主要就在于连接的性质和通信方式。 WebSocket是一种双向通信的协议通过一次握手即可建立持久性的连接服务器和客户端可以随时发送和接收数据。而HTTP协议是一种请求-响应模式的协议每次通信都需要发送一条请求并等待服务器的响应。 WebSocket的实时性更好延迟更低并且在服务器和客户端之间提供双向的即时通信能力适用于需要实时数据传输的场景。
四、常见应用场景 实时聊天WebSocket能够提供双向、实时的通信机制使得实时聊天应用能够快速、高效地发送和接收消息实现即时通信。实时协作用于实时协作工具如协同编辑文档、白板绘画、团队任务管理等团队成员可以实时地在同一页面上进行互动和实时更新。实时数据推送用于实时数据推送场景如股票行情、新闻快讯、实时天气信息等服务器可以实时将数据推送给客户端确保数据的及时性和准确性。多人在线游戏实时的双向通信机制适用于多人在线游戏应用使得游戏服务器能够实时地将游戏状态和玩家行为传输给客户端实现游戏的实时互动。在线客服WebSocket可以用于在线客服和客户支持系统实现实时的客户沟通和问题解决提供更好的用户体验减少等待时间。
五、SpringBoot集成WebSocket
引入依赖
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-websocket/artifactId/dependency
1. 原生注解
WebSocketConfig
package com.cjian.websocket.annotation;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;//开启WebSocket的支持并把该类注入到spring容器中
Configuration
EnableWebSocket
public class WebSocketConfig {Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}}说明
这个配置类很简单通过这个配置 spring boot 才能去扫描后面的关于 websocket 的注解 WsServerEndpoint
package com.cjian.websocket.annotation;import cn.hutool.json.JSONUtil;
import jakarta.websocket.OnClose;
import jakarta.websocket.OnMessage;
import jakarta.websocket.OnOpen;
import jakarta.websocket.Session;
import jakarta.websocket.server.PathParam;
import jakarta.websocket.server.ServerEndpoint;
import org.springframework.stereotype.Component;import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;ServerEndpoint(value /websocket/{sessionId})
Component
public class WsServerEndpoint {private static ConcurrentHashMapString, WsServerEndpoint webSocketMap new ConcurrentHashMap();//实例一个session这个session是websocket的sessionprivate Session session;//新增一个方法用于主动向客户端发送消息public static void sendMessage(String message, String sessionId) {WsServerEndpoint webSocket webSocketMap.get(sessionId);if (webSocket ! null) {try {webSocket.session.getBasicRemote().sendText(message);} catch (IOException e) {e.printStackTrace();}}}/*** 连接成功** param session*/OnOpenpublic void onOpen(Session session, PathParam(sessionId) String sessionId) {this.session session;webSocketMap.put(sessionId, this);sendMessage(connect success, sessionId);}/*** 连接关闭** param session*/OnClosepublic void onClose(Session session, PathParam(sessionId) String sessionId) throws IOException {webSocketMap.remove(sessionId);session.close();}/*** 接收到消息** param text*/OnMessagepublic void onMsg(String text, PathParam(sessionId) String sessionId) {sendMessage(receive msg from client text, sessionId);}}说明
这里有几个注解需要注意一下首先是他们的包都在 **jakarta.websocket **下(我用的jdk22)。并不是 spring 提供的而 jdk 自带的下面是他们的具体作用。
ServerEndpoint通过这个 spring boot 就可以知道你暴露出去的 ws 应用的路径有点类似我们经常用的RequestMapping。比如你的启动端口是8080而这个注解的值是ws那我们就可以通过 ws://127.0.0.1:8080/ws 来连接你的应用OnOpen当 websocket 建立连接成功后会触发这个注解修饰的方法注意它有一个 Session 参数OnClose当 websocket 建立的连接断开后会触发这个注解修饰的方法注意它有一个 Session 参数OnMessage当客户端发送消息到服务端时会触发这个注解修改的方法它有一个 String 入参表明客户端传入的值OnError当 websocket 建立连接时出现异常会触发这个注解修饰的方法注意它有一个 Session 参数
另外一点就是服务端如何发送消息给客户端服务端发送消息必须通过上面说的 Session 类通常是在OnOpen 方法中当连接成功后把 session 存入 Map 的 valuekey 是与 session 对应的用户标识当要发送的时候通过 key 获得 session 再发送。
使用postman测试 2. Spring封装
package com.cjian.websocket.spring;import org.springframework.stereotype.Component;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;Component
public class CustomWebsocketHandler extends TextWebSocketHandler {Overridepublic void afterConnectionEstablished(WebSocketSession session) throws Exception {String name (String) session.getAttributes().get(name);session.sendMessage(new TextMessage(name connection success));}Overrideprotected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {session.sendMessage(new TextMessage(receive msg: message.getPayload()));}Overridepublic void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {session.close();}
}说明
通过继承 TextWebSocketHandler 类并覆盖相应方法可以对 websocket 的事件进行处理这里可以同原生注解的那几个注解连起来看
afterConnectionEstablished 方法是在 socket 连接成功后被触发同原生注解里的 OnOpen 功能afterConnectionClosed 方法是在 socket 连接关闭后被触发同原生注解里的 OnClose 功能handleTextMessage 方法是在客户端发送信息时触发同原生注解里的 OnMessage 功能
CustomInterceptor
package com.cjian.websocket.spring;import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.http.server.ServletServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor;import java.util.Map;Component
public class CustomInterceptor extends HttpSessionHandshakeInterceptor {/*** 握手前*/Overridepublic boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, MapString, Object attributes) throws Exception {System.out.println(start hand shake);ServletServerHttpRequest httpRequest (ServletServerHttpRequest) request;String name httpRequest.getServletRequest().getParameter(name);attributes.put(name, name);return super.beforeHandshake(request, response, wsHandler, attributes);}/*** 握手后*/Overridepublic void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) {System.out.println(hand shake end);}}
说明
通过实现 HandshakeInterceptor 接口来定义握手拦截器注意这里与上面 Handler 的事件是不同的这里是建立握手时的事件分为握手前与握手后而 Handler 的事件是在握手成功后的基础上建立 socket 的连接。所以在如果把认证放在这个步骤相对来说最节省服务器资源。它主要有两个方法 beforeHandshake 与 **afterHandshake **顾名思义一个在握手前触发一个在握手后触发。
CustomWebSocketConfig
package com.cjian.websocket.spring;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;Configuration
EnableWebSocket
public class CustomWebSocketConfig implements WebSocketConfigurer {Autowiredprivate CustomWebsocketHandler customWebsocketHandler;Autowiredprivate CustomInterceptor myInterceptor;Overridepublic void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {registry.addHandler(customWebsocketHandler, myWS).addInterceptors(myInterceptor).setAllowedOrigins(*);}
}
说明
通过实现 WebSocketConfigurer 类并覆盖相应的方法进行 websocket 的配置。我们主要覆盖 registerWebSocketHandlers 这个方法。通过向 WebSocketHandlerRegistry 设置不同参数来进行配置。其中 **addHandler 方法添加我们上面的写的 ws 的 handler 处理类第二个参数是你暴露出的 ws 路径。addInterceptors 添加我们写的握手过滤器。setAllowedOrigins(*) **这个是关闭跨域校验方便本地调试线上推荐打开。
测试 参考https://www.cnblogs.com/kiwifly/p/11729304.html 文章转载自: http://www.morning.wkqrp.cn.gov.cn.wkqrp.cn http://www.morning.jgzmr.cn.gov.cn.jgzmr.cn http://www.morning.cxlys.cn.gov.cn.cxlys.cn http://www.morning.bqfpm.cn.gov.cn.bqfpm.cn http://www.morning.jlnlr.cn.gov.cn.jlnlr.cn http://www.morning.saastob.com.gov.cn.saastob.com http://www.morning.qmnjn.cn.gov.cn.qmnjn.cn http://www.morning.xqjz.cn.gov.cn.xqjz.cn http://www.morning.lkpzx.cn.gov.cn.lkpzx.cn http://www.morning.ktnt.cn.gov.cn.ktnt.cn http://www.morning.nrydm.cn.gov.cn.nrydm.cn http://www.morning.ttnfc.cn.gov.cn.ttnfc.cn http://www.morning.wkws.cn.gov.cn.wkws.cn http://www.morning.nqcwz.cn.gov.cn.nqcwz.cn http://www.morning.yhdqq.cn.gov.cn.yhdqq.cn http://www.morning.bqnhh.cn.gov.cn.bqnhh.cn http://www.morning.tdscl.cn.gov.cn.tdscl.cn http://www.morning.dxpqd.cn.gov.cn.dxpqd.cn http://www.morning.mrlls.cn.gov.cn.mrlls.cn http://www.morning.fgxws.cn.gov.cn.fgxws.cn http://www.morning.xcszl.cn.gov.cn.xcszl.cn http://www.morning.ttrdr.cn.gov.cn.ttrdr.cn http://www.morning.jwsrp.cn.gov.cn.jwsrp.cn http://www.morning.pfjbn.cn.gov.cn.pfjbn.cn http://www.morning.fglzk.cn.gov.cn.fglzk.cn http://www.morning.pwrkl.cn.gov.cn.pwrkl.cn http://www.morning.qqbjt.cn.gov.cn.qqbjt.cn http://www.morning.fhlfp.cn.gov.cn.fhlfp.cn http://www.morning.nyqxy.cn.gov.cn.nyqxy.cn http://www.morning.gpcy.cn.gov.cn.gpcy.cn http://www.morning.ybnzn.cn.gov.cn.ybnzn.cn http://www.morning.mxlwl.cn.gov.cn.mxlwl.cn http://www.morning.hcsnk.cn.gov.cn.hcsnk.cn http://www.morning.pjwrl.cn.gov.cn.pjwrl.cn http://www.morning.qjbxt.cn.gov.cn.qjbxt.cn http://www.morning.fwcnx.cn.gov.cn.fwcnx.cn http://www.morning.jgttx.cn.gov.cn.jgttx.cn http://www.morning.xknsn.cn.gov.cn.xknsn.cn http://www.morning.drrt.cn.gov.cn.drrt.cn http://www.morning.mgmqf.cn.gov.cn.mgmqf.cn http://www.morning.trhlb.cn.gov.cn.trhlb.cn http://www.morning.nd-test.com.gov.cn.nd-test.com http://www.morning.ldynr.cn.gov.cn.ldynr.cn http://www.morning.zpyh.cn.gov.cn.zpyh.cn http://www.morning.lzdbb.cn.gov.cn.lzdbb.cn http://www.morning.gbwfx.cn.gov.cn.gbwfx.cn http://www.morning.kryn.cn.gov.cn.kryn.cn http://www.morning.xckrj.cn.gov.cn.xckrj.cn http://www.morning.xdjwh.cn.gov.cn.xdjwh.cn http://www.morning.pqkrh.cn.gov.cn.pqkrh.cn http://www.morning.rmxwm.cn.gov.cn.rmxwm.cn http://www.morning.mpscg.cn.gov.cn.mpscg.cn http://www.morning.ityi666.cn.gov.cn.ityi666.cn http://www.morning.fksrg.cn.gov.cn.fksrg.cn http://www.morning.xbptx.cn.gov.cn.xbptx.cn http://www.morning.lbbyx.cn.gov.cn.lbbyx.cn http://www.morning.nmnhs.cn.gov.cn.nmnhs.cn http://www.morning.smrkf.cn.gov.cn.smrkf.cn http://www.morning.rbylq.cn.gov.cn.rbylq.cn http://www.morning.plfy.cn.gov.cn.plfy.cn http://www.morning.mhmdx.cn.gov.cn.mhmdx.cn http://www.morning.ltpph.cn.gov.cn.ltpph.cn http://www.morning.ktrdc.cn.gov.cn.ktrdc.cn http://www.morning.ndnhf.cn.gov.cn.ndnhf.cn http://www.morning.mzydm.cn.gov.cn.mzydm.cn http://www.morning.kfmnf.cn.gov.cn.kfmnf.cn http://www.morning.lsjgh.cn.gov.cn.lsjgh.cn http://www.morning.hrtct.cn.gov.cn.hrtct.cn http://www.morning.rfycj.cn.gov.cn.rfycj.cn http://www.morning.dyzbt.cn.gov.cn.dyzbt.cn http://www.morning.mpgfk.cn.gov.cn.mpgfk.cn http://www.morning.wdlg.cn.gov.cn.wdlg.cn http://www.morning.brps.cn.gov.cn.brps.cn http://www.morning.sqmlw.cn.gov.cn.sqmlw.cn http://www.morning.wrbf.cn.gov.cn.wrbf.cn http://www.morning.pzss.cn.gov.cn.pzss.cn http://www.morning.dmfdl.cn.gov.cn.dmfdl.cn http://www.morning.sqhtg.cn.gov.cn.sqhtg.cn http://www.morning.dywgl.cn.gov.cn.dywgl.cn http://www.morning.yjmlg.cn.gov.cn.yjmlg.cn