Websocket实现Java后台主动推送消息到前台
生活随笔
收集整理的這篇文章主要介紹了
Websocket实现Java后台主动推送消息到前台
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
寫在前面
需求:?項目測試,?缺少用戶登錄失敗給admin推送消息,?想到這個方式,?當用戶登錄失敗時,?admin用戶會在頁面看到咣咣亂彈的alert.?
正文
pom.xml
<!-- webSocket 開始--><dependency><groupId>javax.websocket</groupId><artifactId>javax.websocket-api</artifactId><version>1.1</version><scope>provided</scope></dependency><dependency><groupId>javax</groupId><artifactId>javaee-api</artifactId><version>7.0</version><scope>provided</scope></dependency><!-- webSocket 結束-->Websocket.java
package com.jeecg.webSocket;import net.sf.json.JSONObject;import javax.websocket.*; import javax.websocket.server.PathParam; import javax.websocket.server.ServerEndpoint; import java.io.IOException; import java.util.Map; import java.util.concurrent.ConcurrentHashMap;@ServerEndpoint("/webSocket/{username}") public class WebSocket {private static int onlineCount = 0;private static Map<String, WebSocket> clients = new ConcurrentHashMap<String, WebSocket>();private Session session;private String username;@OnOpenpublic void onOpen(@PathParam("username") String username, Session session) throws IOException {this.username = username;this.session = session;addOnlineCount();clients.put(username, this);System.out.println("已連接");}@OnClosepublic void onClose() throws IOException {clients.remove(username);subOnlineCount();}@OnMessagepublic void onMessage(String message) throws IOException {JSONObject jsonTo = JSONObject.fromObject(message);String mes = (String) jsonTo.get("message");if (!jsonTo.get("To").equals("All")){sendMessageTo(mes, jsonTo.get("To").toString());}else{sendMessageAll("給所有人");}}@OnErrorpublic void onError(Session session, Throwable error) {error.printStackTrace();}public void sendMessageTo(String message, String To) throws IOException {for (WebSocket item : clients.values()) {if (item.username.equals(To) )item.session.getAsyncRemote().sendText(message);}}public void sendMessageAll(String message) throws IOException {for (WebSocket item : clients.values()) {item.session.getAsyncRemote().sendText(message);}}public static synchronized int getOnlineCount() {return onlineCount;}public static synchronized void addOnlineCount() {WebSocket.onlineCount++;}public static synchronized void subOnlineCount() {WebSocket.onlineCount--;}public static synchronized Map<String, WebSocket> getClients() {return clients;} }fineui_home.jsp
<script>var websocket = null;var host = document.location.host;// 獲得當前登錄人員的userNamevar username = '${loginUserName}';// 獲取項目名var webName = '${webName}';//判斷當前瀏覽器是否支持WebSocketif ('WebSocket' in window) {// 瀏覽器支持Websocketwebsocket = new WebSocket('ws://' + host + '/' + webName + '/webSocket/' + username);} else {// 瀏覽器 Not support websocket }//WebSocket連接發生錯誤的回調方法websocket.onerror = function () {setMessageInnerHTML("WebSocket連接發生錯誤");};//WebSocket連接成功建立的回調方法websocket.onopen = function () {setMessageInnerHTML("WebSocket連接成功");};//接收到消息的回調方法websocket.onmessage = function (event) {alertTip(event.data);// websocket.close();// alert("webSocket已關閉!") };//監聽窗口關閉事件,當窗口關閉時,主動去關閉websocket連接,防止連接還沒斷開就關閉窗口,server端會拋異常。window.onbeforeunload = function () {closeWebSocket();};//關閉WebSocket連接function closeWebSocket() {websocket.close();}//連接關閉的回調方法websocket.onclose = function () {setMessageInnerHTML("WebSocket連接關閉");};//將消息顯示在網頁上function setMessageInnerHTML(innerHTML) {// document.getElementById('message').innerHTML += innerHTML + '<br/>'; } </script>業務調用
WebSocket ws = new WebSocket(); JSONObject jo = new JSONObject(); jo.put("message", "這個比密碼不對還想登錄!"); jo.put("To", "admin");// 給用戶名為admin的用戶推送 try {ws.onMessage(jo.toString()); } catch (IOException e) {e.printStackTrace(); }感謝
-
https://www.cnblogs.com/best/p/5695570.html
-
https://www.cnblogs.com/freud/p/8397934.html
?
轉載于:https://www.cnblogs.com/yadongliang/p/11459903.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的Websocket实现Java后台主动推送消息到前台的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 你的服务器够安全吗
- 下一篇: “互联网从此没有 BAT”