客户端代码:
var socket = null;
var url = "wss://" + window.location.host + "/projectName/ws";
if(window.location.protocol == "http:") {
url = "ws://" + window.location.host + "/projectName/ws";
}
var timeout;
var reconnecting = false;//是否在重连
//重新连接
function reConnectWebsocket() {
if(reconnecting) {
return;
};
reconnecting = true;
//有定时任务 先取消再设置
timeout && clearTimeout(timeout);
//10秒重连
timeout = setTimeout(function () {
console.log('try to reconnect websocket');
reconnecting = false;
createWebsocket();
}, 10000);
}
//初始化websocket
function createWebsocket() {
try {
if ("WebSocket" in window) {
socket = new WebSocket(url);
} else if ("MozWebSocket" in window) {
socket = new MozWebSocket(url);
} else {
socket = new WebSocket(url);
}
socket.onopen = function () {
console.log("connect to websocket");
};
socket.onmessage = function (evt) {
console.log('recv message:'+ evt.data);
WsServiceListReload(selectedGroupName);
};
socket.onclose = function (evt) {
console.log(evt);
reConnectWebsocket();
}
socket.onerror = function (evt) {
console.log(evt);
}
} catch (err) {
console.error(err);
reConnectWebsocket();
}
}
createWebsocket();
服务端:
import org.apache.log4j.Logger
import javax.websocket.CloseReason
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
import java.util.concurrent.ConcurrentHashMap
@ServerEndpoint("/ws") //websocket连接地址
class OriginWebSocketService {
private final Logger log = Logger.getLogger(this.class);//日志
//存储客户端session
public static Map
OriginWebSocketService() {
System.out.println("OriginWebSocketService()");
}
@OnOpen
public void onOpen(Session session) throws IOException {
//session.getBasicRemote().sendText("你好,客户端");
log.info("client connect ,client id:" << session.getId());
conMap.put(session.getId(),session);
}
@OnMessage
public void onMessage(String message, Session session) throws IOException {
log.info("收到消息:" + message);
}
@OnError
public void onError(Throwable e) {
e.printStackTrace();
}
@OnClose
public void onClose(Session session, CloseReason reason) {
log.info("client disconnect ,client id:" << session.getId());
log.warn(reason.toString());
conMap.remove(session.getId());
}
//广播消息
public static broadcast(String json) {
try{
for(String key:conMap.keySet()) {
Session val = conMap.get(key);
if(val != null) {
val.getBasicRemote().sendText(json);
}
}
}catch (Exception e){
e.printStackTrace();
}
}
}