maven引入jar包或者使用tomcat8以上中的websocket-api.jarjavascript
<dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>7.0</version> <scope>provided</scope> </dependency>
WebSocket.java前端
package com.web.common; import org.slf4j.Logger; import org.slf4j.LoggerFactory; 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; /** * WebSocket鏈接 sessionKey是url中的參數 */ @ServerEndpoint("/websocket/{sessionKey}") public class WebSocket { private static final Logger log = LoggerFactory.getLogger(WebSocket.class); //靜態變量,用來記錄當前在線鏈接數。應該把它設計成線程安全的。 private static int onlineCount = 0; //concurrent包的線程安全,用來存放每一個客戶端對應的MyWebSocket對象。若要實現服務端與單一客戶端通訊的話,能夠使用Map來存放,其中Key能夠爲用戶標識 private static Map<String, WebSocket> webSockets = new ConcurrentHashMap<>(); //與某個客戶端的鏈接會話,須要經過它來給客戶端發送數據 private Session session; /** * 鏈接創建成功調用的方法 * @param session 可選的參數。session爲與某個客戶端的鏈接會話,須要經過它來給客戶端發送數據 * @param sessionKey url地址參數 */ @OnOpen public void onOpen(Session session, @PathParam("sessionKey") String sessionKey){ if (!webSockets.containsKey(sessionKey)){ this.session = session; webSockets.put(sessionKey, this); addOnlineCount(); log.info("當前websocket鏈接數:" + onlineCount); } } /** * 鏈接關閉調用的方法 * @param sessionKey url地址參數 */ @OnClose public void onClose(@PathParam("sessionKey") String sessionKey){ if (webSockets.containsKey(sessionKey)){ webSockets.remove(sessionKey); subOnlineCount(); log.info("當前websocket鏈接數:" + onlineCount); } } /** * 收到客戶端消息後調用的方法 * @param message 客戶端發送過來的消息 * @param session 可選的參數 */ @OnMessage public void onMessage(String message, Session session) { log.info("來自客戶端的消息:" + message); } /** * 發生錯誤時調用 * @param session 可選的參數 * @param error 錯誤消息 */ @OnError public void onError(Session session, Throwable error){ log.error("websocket發生錯誤:" + error); } /** * 該方法沒有用註解,是根據本身須要添加的方法。在本身的業務中調用,發送消息給前端。 * @param sessionKey * @param message 返回的結果 * @throws IOException */ public static void sendMessage(String sessionKey,String message) throws IOException { WebSocket webSocket = webSockets.get(sessionKey); if (null != webSocket){ log.info("websocket發送消息:" + message); //同步發送 發送第二條時,必須等第一條發送完成 webSocket.session.getBasicRemote().sendText(message); //異步發送 //webSocket.session.getAsyncRemote().sendText(message); } } public static synchronized int getOnlineCount() { return onlineCount; } public static synchronized void addOnlineCount() { onlineCount++; } public static synchronized void subOnlineCount() { onlineCount--; } }
前端jsjava
var webSocket = null; $(function () { //判斷當前瀏覽器是否支持WebSocket if ('WebSocket' in window) { webSocket = new _WebSocket("${WEBSOCKET_URL}/websocket/${(receipt.id)!''}"); } else { alert('當前瀏覽器不支持webSocket'); } //鏈接成功創建的回調方法 websocket.onopen = function() { console.info("WebSocket鏈接成功"); }; //鏈接出錯 webSocket.onerror = function (ev) { console.info('鏈接錯誤', ev); }; //接收到消息的回調方法 webSocket.onmessage = function (ev) { console.info(ev); }; //鏈接關閉的回調方法 webSocket.onclose = function () { console.info('WebSocket鏈接關閉'); }; }); //關閉WebSocket鏈接 function closeWebSocket() { webSocket.close(); }