開發中經常會有這樣的使用場景.如某個用戶在一個數據上做了xx操作, 與該數據相關的用戶在線上的話,需要實時接收到一條信息.
這種可以使用WebSocket來實現. 另外,對於消息,可以定義一個類進行固化. 主要是消息內容,接收人,發送人,是否已發送等. 用戶上線時, 通過方法去查詢出來然后進行發送
@ServerEndpoint(value = "/websocket/{sessionId}") public class MyWebSocket { //靜態變量,用來記錄當前在線連接數。應該把它設計成線程安全的。 private static AtomicInteger onlineCount = new AtomicInteger(0); //concurrent包的線程安全Set,用來存放每個客戶端對應的MyWebSocket對象。若要實現服務端與單一客戶端通信的話,可以使用Map來存放,其中Key可以為用戶標識 public static CopyOnWriteArraySet<MyWebSocket> webSocketSet = new CopyOnWriteArraySet<MyWebSocket>(); //與某個客戶端的連接會話,需要通過它來給客戶端發送數據 public Session session; /** * 連接建立成功調用的方法 * * @param session 可選的參數。session為與某個客戶端的連接會話,需要通過它來給客戶端發送數據 */ @OnOpen public void onOpen(Session session) { this.session = session; if (webSocketSet.add(this)) { System.out.println("有新連接加入!當前在線人數為" + onlineCount.incrementAndGet()); } } /** * 連接關閉調用的方法 */ @OnClose public void onClose() { if (webSocketSet.remove(this)) { System.out.println("有一連接關閉!當前在線人數為" + onlineCount.decrementAndGet()); } } /** * 收到客戶端消息后調用的方法 * * @param message 客戶端發送過來的消息 * @param session 可選的參數 */ @OnMessage public void onMessage(String message, Session session) { System.out.println("來自客戶端的消息:" + message); //群發消息 /* for(MyWebSocket item: webSocketSet){ try { item.sendMessage(message); } catch (IOException e) { e.printStackTrace(); continue; } }*/ } /** * 發生錯誤時調用 * * @param session * @param error */ @OnError public void onError(Session session, Throwable error) { System.out.println("發生錯誤"); error.printStackTrace(); } private static ReentrantLock lock = new ReentrantLock(true); /** * 該方法是我們根據業務需要調用的. * * @param message * @throws IOException */ public void sendMessage(String message) throws IOException { synchronized(this.session) { if (session.isOpen()) { this.session.getAsyncRemote().sendText(message); } } } }
頁面中的調用.每個客戶都要初始化一個websocket示例. 其中我們用用戶的userId作為標識的一部分.
//頁面加載完成. 初始化一個webSocket對象.然后可以根據需要調一個來發信息 window.onload = function () { initWebSocket(); setTimeout(function(){ $.post('<%=basePath %>xxx.do',function(r){ //alert(0); }); },2000); }; function initWebSocket() { webSocket = new WebSocket(requestUrl.replace("http", "ws") + 'websocket/${userId}'); webSocket.onerror = function (event) { onError(event) }; //連接建立成功事件 webSocket.onopen = function (event) { onOpen(event) }; //接收到服務端消息事件 webSocket.onmessage = function (event) { onMessage(event) }; }