java Springboot搭建websocket 服务端和html客户端代码
这块 网上案例挺多的 本来也不准备写 但是 反正也是接触到了 写下来 也算做个记录
第一步、引入jar包
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency>
springboot项目 自带websocket就直接引入了
第二步、搭建websocket服务
- WebSocketConfig
package com.jinfu.sdkdemo.websocket; 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; @Configuration @EnableWebSocket public class WebSocketConfig { @Bean public ServerEndpointExporter serverEndpoint() { return new ServerEndpointExporter(); } }
- wobsocket服务
package com.jinfu.sdkdemo.websocket; import lombok.extern.slf4j.Slf4j;import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import javax.websocket.*; import javax.websocket.server.PathParam; import javax.websocket.server.ServerEndpoint; import java.util.concurrent.ConcurrentHashMap; /** * @ServerEndpoint 通过这个 spring boot 就可以知道你暴露出去的 websockst 应用的路径,有点类似我们经常用的@RequestMapping。比如你的启动端口是8080,而这个注解的值是ws,那我们就可以通过 ws://127.0.0.1:8080/websocket 来连接你的应用 * @OnOpen 当 websocket 建立连接成功后会触发这个注解修饰的方法,注意它有一个 Session 参数 * @OnClose 当 websocket 建立的连接断开后会触发这个注解修饰的方法,注意它有一个 Session 参数 * @OnMessage 当客户端发送消息到服务端时,会触发这个注解修改的方法,它有一个 String 入参表明客户端传入的值 * @OnError 当 websocket 建立连接时出现异常会触发这个注解修饰的方法,注意它有一个 Session 参数 */ @ServerEndpoint("/websocket/{id}") @Component @Slf4j public class WebSocketServer {/** * concurrent包的线程安全Set,用来存放每个客户端对应的WebSocketController对象。 */ private static ConcurrentHashMap<String, WebSocketServer> webSocketMap = new ConcurrentHashMap<>(); //与某个客户端的连接会话,需要通过它来给客户端发送数据 private Session session; /** * 接收id */ private String id; /** * 连接建立成功调用的方法 */ @OnOpen public void onOpen(Session session, @PathParam("id") String id) { this.session = session; this.id = id; //如果已经包含该用户id,则移除后重新加入 if (webSocketMap.containsKey(id)) { webSocketMap.remove(id); webSocketMap.put(id, this); } else { //否则直接加入 webSocketMap.put(id, this); } } /** * 连接关闭调用的方法 */ @OnClose public void onClose() { if (webSocketMap.containsKey(id)) { webSocketMap.remove(id); log.info(">>> 用户:{}已关闭连接", id); } else { log.info(">>> 连接已关闭..."); } } /** * 收到客户端消息后调用的方法 * * @param message 客户端发送过来的消息 */ @OnMessage public void onMessage(String message, Session session){ //接收传过来的消息 System.out.println("收到的消息:"+message);
//发送消息
sendMessage("发送消息"); } /** * @param session * @param error */ @OnError public void onError(Session session, Throwable error) { log.error(">>> WebSocket出现未知错误: "); error.printStackTrace(); } /** * 实现服务器主动推送 */ public void sendMessage(String message){ try { this.session.getBasicRemote().sendText(message); } catch (Exception e) { log.error(">>> WebSocket消息发送出现错误: "); e.printStackTrace(); } } }
上面websockst的服务端就搭建好了
第三步、websocket客户端,也就是前端的websocket连接
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> <meta charset="utf-8"/> <title>首页</title> </head> <body> <input type="button" value="发送" onclick="send()"> <div id="title"> </div> <!-- js部分 --> <script type="text/javascript" th:src="@{/jquery-3.2.1.min.js}"></script> <script> var ws; openWebSocket(); function openWebSocket(){ if ("WebSocket" in window) { //如果已经有连接,则断开并重新连接 if (ws != null) { ws.close(); ws = null; } // 创建一个 websocket
var UUID = 123;
ws = new WebSocket("ws://localhost:8080/websocket/"+UUID); ws.onopen = function () { console.log('WebSocket连接已建立') }; //获得消息事件 ws.onmessage = function (evt) { $("#title").html('<p>接收:'+evt.data+'</p>'); }; ws.onclose = function () { console.log('WebSocket连接已断开') }; } else { // 浏览器不支持 WebSocket console.log('您的浏览器不支持 WebSocket!'); } } function send(){ ws.send("发送一条消息"); }</script> </body> </html>
到这里 结束 总体上来说 很简单 玩一次后面就会了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)