Spring Boot整合WebSocket

发布时间:2026/9/12 17:54:08
Spring Boot整合WebSocket 一、前言本节简单介绍下如何在Spring Boot引入WebSocket实现简单的客户端与服务端建立长连接并互发送文本消息。二、框架搭建2.1 依赖引入dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-websocket/artifactId/dependency2.2 构建服务端新建handler包然后在该包下新建MyStringWebSocketHandler继承TextWebSocketHandlerComponentSlf4jpublicclassMyStringWebSocketHandlerextendsTextWebSocketHandler{OverridepublicvoidafterConnectionEstablished(WebSocketSessionsession){log.info(和客户端建立连接);}OverridepublicvoidhandleTransportError(WebSocketSessionsession,Throwableexception)throwsException{session.close(CloseStatus.SERVER_ERROR);log.error(连接异常,exception);}OverridepublicvoidafterConnectionClosed(WebSocketSessionsession,CloseStatusstatus)throwsException{super.afterConnectionClosed(session,status);log.info(和客户端断开连接);}OverrideprotectedvoidhandleTextMessage(WebSocketSessionsession,TextMessagemessage)throwsException{// 获取到客户端发送过来的消息StringreceiveMessagemessage.getPayload();log.info(receiveMessage);// 发送消息给客户端session.sendMessage(newTextMessage(fakeAi(receiveMessage)));// 关闭连接// session.close(CloseStatus.NORMAL);}privatestaticStringfakeAi(Stringinput){if(inputnull||.equals(input)){return你说什么没听清;}returninput.replace(你,我).replace(吗,).replace(?,!).replace(,);}}该类重写了父类AbstractWebSocketHandler的四个方法afterConnectionEstablished和客户端链接成功的时候触发该方法handleTransportError和客户端连接失败的时候触发该方法afterConnectionClosed和客户端断开连接的时候触发该方法handleTextMessage和客户端建立连接后处理客户端发送的请求。此外因为我们的目的是实现和客户端的通信并且内容为文本内容所以我们继承的是TextWebSocketHandler如果传输的是二进制内容则可以继承BinaryWebSocketHandler更多信息可以自行查看WebSocketHandler的子类。2.3 配置类接着新建config包然后在该包下新建WebSocketServerConfigure配置类ConfigurationEnableWebSocketpublicclassWebSocketServerConfigureimplementsWebSocketConfigurer{AutowiredprivateMyStringWebSocketHandlermyStringWebSocketHandler;OverridepublicvoidregisterWebSocketHandlers(WebSocketHandlerRegistrywebSocketHandlerRegistry){webSocketHandlerRegistry.addHandler(myStringWebSocketHandler,/connect).withSockJS();}}EnableWebSocket用于开启WebSocket相关功能我们注入了上面创建的MyStringWebSocketHandler并将其注册到了WebSocketHandlerRegistry。上面代码的含义是当客户端通过/connecturl和服务端连接通信时使用MyStringWebSocketHandler处理会话。withSockJS的含义是通信的客户端是通过SockJS实现的下面会介绍到。三、构建客户端SockJS是一个JS插件用于构建WebSocket兼容性好。在resources目录下新建static包然后在该包下新建client.html!DOCTYPEhtmlhtmllangenheadmetacharsetUTF-8titleWebSocket客户端/titlescriptsrchttps://cdn.bootcss.com/sockjs-client/0.3.4/sockjs.min.js/scriptlinkhrefhttps://cdn.bootcss.com/twitter-bootstrap/4.4.1/css/bootstrap.min.cssrelstylesheet/headbodystyle.jumbotron{width:100%;}#text{height:3rem;font-size:1rem;line-height:3rem;margin:1rem;}.btn{margin-right:5px;}#connect{margin-left:1rem;}#log{margin:1rem 0 0 1rem;}/styledivclasscontainerdivclassrowdivclassjumbotroninputtypetextplaceholder请输入你想传输的内容idtextclasscol-lg-12/inputtypebuttonvalue连接classbtn btn-infoidconnectonclickconnect()/inputtypebuttonvalue发送classbtn btn-successidsentdisableddisabledonclicksent()/inputtypebuttonvalue断开classbtn btn-dangeriddisconnectdisableddisabledonclickdisconnect()/dividlogp聊天记录:/p/div/div/div/divscripttypetext/javascriptlettextdocument.querySelector(#text);letconnectBtndocument.querySelector(#connect);letsentBtndocument.querySelector(#sent);letdisconnectBtndocument.querySelector(#disconnect);letlogDivdocument.querySelector(#log);letwsnull;functionconnect(){lettargetUri/connect;wsnewSockJS(targetUri);ws.onopenfunction(){setConnected(true);log(和服务端连接成功);};ws.onmessagefunction(event){log(服务端说event.data);};ws.onclosefunction(){setConnected(false);log(和服务端断开连接)}}functionsent(){if(ws!null){ws.send(text.value);log(客户端说text.value);}else{log(请先建立连接)}}functiondisconnect(){if(ws!null){ws.close();wsnull;}setConnected(false);}functionlog(value){letcontentdocument.createElement(p);content.innerHTMLvalue;logDiv.appendChild(content);text.value;}functionsetConnected(connected){connectBtn.disabledconnected;disconnectBtn.disabled!connected;sentBtn.disabled!connected;}/script/body/htmlhtmlcss那些都不重要重要的是我们引入了SockJS库。在connect()方法中我们通过new SockJS(/connect)和上面的服务端建立了Socket通信。SockJS对象包含几个常用的实用方法onopen和服务端讲了连接后的回调方法onmessage服务端返回消息时的回调方法onclose和服务端断开连接的回调方法send发送消息给服务端close断开和服务端的连接。上面的JS较为简单其他逻辑自己看看吧。四、通信测试启动项目浏览器访问http://localhost:8080/client.html

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询