使用WebSocket實現服務端和客戶端的通信


開發中經常會有這樣的使用場景.如某個用戶在一個數據上做了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)
};
}
復制代碼

---------------------
作者:Wing_gor
來源:CSDN
原文:https://blog.csdn.net/qq_40085888/article/details/86308612

----------------------------------------------------------------------------------------------------------


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM