package cn.softmr.account.files.service.impl; import cn.softmr.account.files.module.TbMessage; import cn.softmr.account.files.module.TbMessageExample; import cn.softmr.account.files.module.UserLoginInfo; import cn.softmr.account.files.service.TbFileLogService; import cn.softmr.account.files.service.TbMessageService; import cn.softmr.util.Constants; import cn.softmr.util.DateUtils; import cn.softmr.util.JWTUtil; import cn.softmr.util.SpringContextUtil; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import javax.websocket.*; import javax.websocket.server.ServerEndpoint; import java.io.IOException; import java.util.*; import java.util.concurrent.CopyOnWriteArraySet; import java.util.concurrent.atomic.AtomicLong; @ServerEndpoint("/websocket") public class MessageWebsocket { private Timer timer; private static AtomicLong socketCount = new AtomicLong(); private Session session; private static final Logger logger = Logger.getLogger(MessageWebsocket.class); //客户端和服务端建立链接的Websocket集合 private static CopyOnWriteArraySet<MessageWebsocket> webSocketSet = new CopyOnWriteArraySet<MessageWebsocket>(); @Autowired protected TbMessageService tbMessageService = (TbMessageService) SpringContextUtil.getBean("tbMessageService"); @Autowired protected TbFileLogService tbFileLogService = (TbFileLogService) SpringContextUtil.getBean("tbFileLogService"); private static List<Integer> logTypeList=Arrays.asList(Constants.TbFileLogStatus.FILE_CREATE,Constants.TbFileLogStatus.UPLOAD_FILE); /** * 建立链接 */ @OnOpen public void onOpen(Session session){ logger.info("onOpen===建立链接 === "); this.session = session; webSocketSet.add(this); String tokenstr = session.getQueryString(); logger.info("session.getQueryString()"+tokenstr); String[] toekn=tokenstr.split("="); UserLoginInfo userLoginInfo = JWTUtil.unsign(toekn[1], UserLoginInfo.class); if(userLoginInfo!=null) { String userId = userLoginInfo.getUserid(); //启动一个单独的线程,每隔一秒钟推送当前时间到web客户端 timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { batch(userId); } }, 0, 1*1000L); } logger.info("session count is " + socketCount.incrementAndGet()); } /** * 关闭链接 */ @OnClose public void opClose(){ logger.info("opClose===关闭链接 "); webSocketSet.remove(this); if(timer != null){ timer.cancel(); timer = null; } logger.info("session count is " + socketCount.decrementAndGet()); } /** * 服务端接收客户端发来的消息 * @param message * @param session */ @OnMessage public void onMessage(String message, Session session) { logger.info("onMessage==触发==来自客户端的消息:" + message); String tokenstr = session.getQueryString(); System.out.println("session.getQueryString()"+tokenstr); String[] toekn=tokenstr.split("="); UserLoginInfo userLoginInfo = JWTUtil.unsign(toekn[1], UserLoginInfo.class); if(userLoginInfo!=null) { String userId = userLoginInfo.getUserid(); batch(userId); } } /** * 异常处理 * @param session * @param error */ @OnError public void onError(Session session, Throwable error){ logger.info("onError===发生错误"); error.printStackTrace(); } /** * 往所有web客户端发送消息 * @param userId */ private void batch(String userId){ try { TbMessageExample example=new TbMessageExample(); example.createCriteria() .andRemark2EqualTo(userId) .andStatusEqualTo(Constants.TbMessageStatus.UN_SEND); example.setOrderByClause(" id "); List<TbMessage> tbMessagelist = tbMessageService.selectByExample(example); if(tbMessagelist.size()>0){ TbMessage tbMessageUp=new TbMessage(); tbMessageUp.setStatus(Constants.TbMessageStatus.SEND); tbMessageService.updateByExampleSelective(tbMessageUp,example); List<TbMessage> tbMessagelist2 = tbMessagelist.size()>5?tbMessagelist.subList(0,5):tbMessagelist; for(TbMessage tbMessage:tbMessagelist2){ try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } String operType = tbMessage.getTitile(); String fileNameStr = tbMessage.getContent(); Date logDate = tbMessage.getCreateDate(); String createUser = tbMessage.getCreateUser(); String messageStr = operType+"|"+fileNameStr+"|"+DateUtils.formatDate(logDate)+"|"+createUser; this.sendMessage(messageStr); } } } catch (IOException e) { e.printStackTrace(); } } /** * 发送消息到web客户端 * @param message * @throws IOException */ public void sendMessage(String message) throws IOException{ this.session.getBasicRemote().sendText(message); //this.session.getAsyncRemote().sendText(message); } }
<%@ page language="java" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Web Socket</title> </head> <body> <input id="text" type="text" /> <button οnclick="send()">Send</button> <button οnclick="closeWebSocket()">Close</button> <div id="message"> </div> <script type="text/javascript"> var websocket = null; if('WebSocket' in window){ websocket = new WebSocket("ws://localhost:8081/websocket?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1NzI5MjQwMjg4MDMsInBheWxvYWQiOiJ7XCJ1c2VybmFtZVwiOlwi6IC_5piO5piOXCIsXCJ1c2VyaWRcIjpcIjQxMjcyODE5OTAxMTAyNDYzMlwiLFwidXNlcnBzZFwiOlwiMTIzNDU2XCJ9In0.DKGigsNkolCsveM0REPaEDGoA3RV_KsgAXrpMNKFbpI"); }else{ alert('Not support websocket'); } //连接出现错误,触发该方法 websocket.onerror = function(){ setMessageInnerHTML("error"); }; //成功建立连接,触发该方法 websocket.onopen = function(event){ setMessageInnerHTML("连接已建立,可以开始群聊啦!"); } //客户端收到消息,触发该方法 websocket.onmessage = function(event){ setMessageInnerHTML(event.data); } //连接关闭,触发该方法 websocket.onclose = function(){ setMessageInnerHTML("连接已关闭!"); } //窗口关闭时,关闭websocket连接 window.onbeforeunload = function(){ websocket.close(); websocket = null; } //将消息显示在网页上 var i = 0; function setMessageInnerHTML(innerHTML){ document.getElementById('message').innerHTML = innerHTML; ++i; if(i > 20){ i = 0; // document.getElementById('message').innerHTML = innerHTML = ""; } } //关闭连接 function closeWebSocket(){ websocket.close(); websocket = null; } //发送消息到服务端 function send(){ var message = document.getElementById('text').value; websocket.send(message); document.getElementById('text').value = ""; document.getElementById('text').focus(); } </script> </body> </html>