spring-boot框架下的websocket服务
发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,这几天在做web端实时展示服务端日志文件新增内容的功能。要满足实时的需求,我选择的方案是在web端跟服务端建立一个websocket链接,由服务端通过tail -f 命令将文件新增内容发送给web端。
千家信息网最后更新 2025年12月03日spring-boot框架下的websocket服务
这几天在做web端实时展示服务端日志文件新增内容的功能。要满足实时的需求,我选择的方案是在web端跟服务端建立一个websocket链接,由服务端通过tail -f 命令将文件新增内容发送给web端。
关于websocket的介绍,可以参考这篇博文:http://www.cnblogs.com/lizhenghn/p/5155933.html(链接仅用于学习交流,如有版权问题请及时告知)。这里我主要想介绍的是在spring-boot框架下如何发布websocket服务。
一、在服务端发布websocket服务
服务端发布websocket服务有几种方式,包括Servlet容器扫描初始化、Spring扫描初始化。我使用的是第二种方式,可以将websocket服务定义为一个单独的类实例。
Spring扫描初始化时,需要先定义一个Bean:ServerEndpointExporter,以声明服务端。我把这个Bean独立放到一个websocket 配置类中。
import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.web.socket.server.standard.ServerEndpointExporter;@Configurationpublic class WebSocketConfig { @Bean public ServerEndpointExporter serverEndpointExporter (){ return new ServerEndpointExporter(); } }接下来是定义websocket服务接口,并使用关键字 @ServerEndpoint("/websocketPath") 声明一个接口的访问路径。
import java.io.BufferedReader;import java.io.File;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.util.concurrent.CopyOnWriteArraySet;import javax.websocket.OnClose;import javax.websocket.OnError;import javax.websocket.OnMessage;import javax.websocket.OnOpen;import javax.websocket.Session;import javax.websocket.server.ServerEndpoint;import org.springframework.stereotype.Component;import org.springframework.web.bind.annotation.RestController;@ServerEndpoint("/logWebsocket") @Component @RestControllerpublic class LogWebSocketHandle { private Session session;//每个websocket会话连接对应一个session private static CopyOnWriteArraySet webSocketSet = new CopyOnWriteArraySet<>(); /** * 新的WebSocket请求开启。 * 新建立连接后会触发onOpen方法 * @throws JSchException * @throws IOException */ @OnOpen public void onOpen(Session session) throws JSchException, IOException { this.session = session; webSocketSet.add(this); //服务端保留session信息,并返回结果给客户端 //这个语句用于服务端给客户端发送数据 session.getBasicRemote().sendText("正在获取日志
"); } /** * WebSocket请求关闭。 * websocket连接关闭后,会触发onClose方法 */ @OnClose public void onClose() { webSocketSet.remove(this); } @OnError public void onError(Throwable thr) { thr.printStackTrace(); } /** * 客户端发送消息时,服务端通过onMessage方法接收 */ @OnMessage public void onMessage (String message, Session session) throws IOException, JSchException, InterruptedException { LOG.info("来自客户端的message:" + message); try { //process message //TODO } catch (IOException e) { e.printStackTrace(); }// 给客户端群发消息 // for ( Session item : webSocketSet ){ // item.getBasicRemote().sendText(message); // } } } 二、web端建立websocket连接
var websocket_host = _window.location.host;//与服务端建立websocket连接var websocket = new WebSocket("ws://"+websocket_host+"/项目名/logWebsocket");//连接建立后,会触发onopen方法websocket.onopen = function(event){ console.log("opened!"); $("#chart_multiple div").append(event.data); //向服务端发送数据 websocket.send(message);};//接收服务端的数据websocket.onmessage = function(event){ $("#chart_multiple div").append(event.data); $("#chart_multiple").scrollTop( $("#chart_multiple div").height()-$("#chart_multiple").height() );}三、使用nginx转发时的额外配置
如果项目使用了nginx进行负载均衡,那么需要在nginx.conf配置文件中添加一个websocket转发配置,具体为:
location /#{websocket所在的项目名}/logWebsocket { proxy_pass http://ip:port/#{websocket所在的项目名}/logWebsocket; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_read_timeout 7200s;}
服务
客户
客户端
方法
项目
配置
数据
文件
内容
实时
所在
接口
方式
日志
是在
消息
端的
链接
框架
均衡
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
香港微信网络技术有限公司
全国儿童发烧数据库
深圳c语言软件开发怎么样
idc200g防护服务器
魔兽世界数据库表中文
健康码能用到数据库吗
每台服务器地址固定吗
软件开发综合实训心得周志
傻瓜式软件开发平台
耒阳市软件开发创意园
宜春物理服务器多少钱
万律数据库购买电话
linux线上生产服务器
全球金融软件开发商
软件开发哪个方面最好
自建服务器需要怎么做
血常规数据库
机架式服务器的结构
前端软件开发前景怎么样
文明重启什么服务器是核心
pc加入服务器快捷键
珠海商城软件开发定做
fm2016数据库的选择
变电站网络安全分区
推荐网易版好玩的服务器我的世界
SQL中不同的数据库取数
内部竞聘软件开发主管
数据库查找 步骤
软件开发与测试哪个学校好
数据库表与表之间的关系图叫什么