src/main/java/com/whyc/service/BattRtstateService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/whyc/webSocket/RealTimeWebsocket.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/webapp/index1.html | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/whyc/service/BattRtstateService.java
@@ -42,10 +42,10 @@ return new Response().set(1,pageInfo,"查询成功"); } //查询实时组端信息 public Response serchByCondition(int battGroupId) { PageHelper.startPage(1,1); public Response<BattRtstate> serchByCondition(int battGroupId) { QueryWrapper wrapper=new QueryWrapper(); wrapper.eq("BattGroupId",battGroupId); wrapper.last(" limit 1"); BattRtstate brt=battRtstateMapper.selectOne(wrapper); return new Response().set(1,brt); } src/main/java/com/whyc/webSocket/RealTimeWebsocket.java
New file @@ -0,0 +1,75 @@ package com.whyc.webSocket; import com.whyc.service.BattRtstateService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.websocket.*; import javax.websocket.server.ServerEndpoint; import java.io.IOException; import java.util.HashMap; import java.util.Map; @Component @ServerEndpoint(value = "/RealTime",encoders = WebSocketEncoder.class) public class RealTimeWebsocket { private volatile Thread thread; private static final int executeTime = 5000; private static Map<String,Thread> threadMap = new HashMap<>(); private static BattRtstateService service; private Session session; @Autowired public void setService(BattRtstateService service) { RealTimeWebsocket.service = service; } @OnOpen public void onOpen(Session session){ this.session=session; } @OnMessage public void onMessage(Session session, String battGroupId){ //停止当前socket的线程 Thread threadBefore = threadMap.get(session.getId()); if(threadBefore !=null && threadBefore.isAlive()){ threadBefore.interrupt(); } thread = new Thread("Thread_RealTime") { public void run() { while (!thread.isInterrupted()) { try { if (session.isOpen()) { session.getBasicRemote().sendObject(service.serchByCondition(Integer.valueOf(battGroupId))); } sleep(executeTime); } catch (IOException | InterruptedException | EncodeException e) { interrupt(); } } } }; thread.start(); //将线程存储,便于调用定位 threadMap.put(session.getId(), this.thread); } @OnClose public void onClose(){ if (thread != null && thread.isAlive()) { thread.interrupt(); } } @OnError public void onError(Throwable error) { error.printStackTrace(); if (thread != null && thread.isAlive()) { thread.interrupt(); } } } src/main/webapp/index1.html
@@ -1,10 +1,66 @@ <!DOCTYPE html> <html lang="en"> <html> <head> <meta charset="UTF-8"> <title>Title</title> <title>Java后端WebSocket的Tomcat实现</title> </head> <body> <h1>Index页面加载成功!</h1> <br/><input id="text" type="text"/> <button onclick="send()">发送消息</button> <hr/> <button onclick="closeWebSocket()">关闭WebSocket连接</button> <hr/> <div id="message"></div> </body> <script type="text/javascript"> var websocket = null; //判断当前浏览器是否支持WebSocket if ('WebSocket' in window) { websocket = new WebSocket("ws://localhost:8090/fg/RealTime"); } else { alert('当前浏览器 Not support websocket') } //连接发生错误的回调方法 websocket.onerror = function () { setMessageInnerHTML("WebSocket连接发生错误"); }; //连接成功建立的回调方法 websocket.onopen = function () { setMessageInnerHTML("WebSocket连接成功"); } //接收到消息的回调方法 websocket.onmessage = function (event) { setMessageInnerHTML(event.data); } //连接关闭的回调方法 websocket.onclose = function () { setMessageInnerHTML("WebSocket连接关闭"); } //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。 window.onbeforeunload = function () { closeWebSocket(); } //将消息显示在网页上 function setMessageInnerHTML(innerHTML) { document.getElementById('message').innerHTML += innerHTML + '<br/>'; } //关闭WebSocket连接 function closeWebSocket() { websocket.close(); } //发送消息 function send() { var message = document.getElementById('text').value; websocket.send(message); } </script> </html>