Java使用WebSocket

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();
    }
相關文章
相關標籤/搜索