導語:知識重在分享
sendMessage.java(類)
package websocket;import java.io.IOException;import java.util.concurrent.CopyOnWriteArraySet;import javax.websocket.OnClose;import javax.websocket.OnError;import javax.websocket.OnMessage;import javax.websocket.OnOpen;import javax.websocket.Session;import javax.websocket.server.ServerEndpoint;//該注解用來指定一個URI窟社,客戶端可以通過這個URI來連接到WebSocket。類似Servlet的注解mapping绪钥。無需在web.xml中配置灿里。@ServerEndpoint("/websocket")public class MyWebSocket {? //靜態(tài)變量,用來記錄當前在線連接數(shù)昧识。應該把它設計成線程安全的钠四。? private static int onlineCount = 0;? ? //concurrent包的線程安全Set盗扒,用來存放每個客戶端對應的MyWebSocket對象跪楞。若要實現(xiàn)服務端與單一客戶端通信的話缀去,可以使用Map來存放,其中Key可以為用戶標識? private static CopyOnWriteArraySetwebSocketSet = new CopyOnWriteArraySet();
//與某個客戶端的連接會話甸祭,需要通過它來給客戶端發(fā)送數(shù)據(jù)
private Session session;
/**
* 連接建立成功調(diào)用的方法
* @param session? 可選的參數(shù)缕碎。session為與某個客戶端的連接會話,需要通過它來給客戶端發(fā)送數(shù)據(jù)
*/
@OnOpen
public void onOpen(Session session){
this.session = session;
webSocketSet.add(this);? ? //加入set中
addOnlineCount();? ? ? ? ? //在線數(shù)加1
System.out.println("有新連接加入池户!當前在線人數(shù)為" + getOnlineCount());
}
/**
* 連接關閉調(diào)用的方法
*/
@OnClose
public void onClose(){
webSocketSet.remove(this);? //從set中刪除
subOnlineCount();? ? ? ? ? //在線數(shù)減1
System.out.println("有一連接關閉咏雌!當前在線人數(shù)為" + getOnlineCount());
}
/**
* 收到客戶端消息后調(diào)用的方法
* @param message 客戶端發(fā)送過來的消息
* @param session 可選的參數(shù)
*/
@OnMessage
public void onMessage(String message, Session session) {
System.out.println("來自客戶端的消息:" + message);
//群發(fā)消息
for(MyWebSocket item: webSocketSet){
try {
item.sendMessage(message);
} catch (IOException e) {
e.printStackTrace();
continue;
}
}
}
/**
* 發(fā)生錯誤時調(diào)用
* @param session
* @param error
*/
@OnError
public void onError(Session session, Throwable error){
System.out.println("發(fā)生錯誤");
error.printStackTrace();
}
/**
* 這個方法與上面幾個方法不一樣。沒有用注解校焦,是根據(jù)自己需要添加的方法赊抖。
* @param message
* @throws IOException
*/
public void sendMessage(String message) throws IOException{
this.session.getBasicRemote().sendText(message);
//this.session.getAsyncRemote().sendText(message);
}
public static synchronized int getOnlineCount() {
return onlineCount;
}
public static synchronized void addOnlineCount() {
MyWebSocket.onlineCount++;
}
public static synchronized void subOnlineCount() {
MyWebSocket.onlineCount--;
}
}
----------------------------------sendMessage結束--------------------------------
index。jsp(頁面)
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%>
發(fā)送信息關閉WebSocket
var websocket = null;? ? ? ? ? ? //判斷當前瀏覽器是否支持WebSocket? ? ? if('WebSocket' in window){? ? ? ? ? websocket = new WebSocket("ws://localhost:8081/WebSocket/websocket");? ? ? }? ? ? else{? ? ? ? ? alert('沒有發(fā)現(xiàn)WebSocket寨典!')? ? ? }? ? ? ? ? ? //連接發(fā)生錯誤的回調(diào)方法? ? ? websocket.onerror = function(){? ? ? ? ? setMessageInnerHTML("錯誤7昭!耸成!");? ? ? };? ? ? ? ? ? //連接成功建立的回調(diào)方法? ? ? websocket.onopen = function(event){? ? ? ? ? setMessageInnerHTML("打開WebSocket連接报亩!");? ? ? }? ? ? ? ? ? //接收到消息的回調(diào)方法? ? ? websocket.onmessage = function(event){? ? ? alert(typeof event);? ? ? console.log(event);? ? ? console.log(event.data);? ? ? ? ? setMessageInnerHTML(event.data);? ? ? }? ? ? ? ? ? //連接關閉的回調(diào)方法? ? ? websocket.onclose = function(){? ? ? ? ? setMessageInnerHTML("關閉WebSocket連接!");? ? ? }? ? ? ? ? ? //監(jiān)聽窗口關閉事件井氢,當窗口關閉時弦追,主動去關閉websocket連接,防止連接還沒斷開就關閉窗口花竞,server端會拋異常劲件。? ? ? window.onbeforeunload = function(){? ? ? ? ? websocket.close();? ? ? }? ? ? ? ? ? //將消息顯示在網(wǎng)頁上? ? ? function setMessageInnerHTML(innerHTML){? ? ? ? ? document.getElementById('message').innerHTML += innerHTML + '
';? ? ? }? ? ? ? ? ? //關閉連接? ? ? function closeWebSocket(){? ? ? ? ? websocket.close();? ? ? }? ? ? ? ? ? //發(fā)送消息? ? ? function send(){? ? ? ? ? var message = document.getElementById('text').value;? ? ? ? ? websocket.send(message);? ? ? }
------------------------------------------我就是用這個通訊的例子來演生的----------------------------------