package com.websocket;
import java.util.Hashtable;
import java.util.Map;
import java.util.Set;
import java.util.logging.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;
@ServerEndpoint(value = "/game")
public class ScoketServer {
private Logger logger = Logger.getLogger(this.getClass().getName());
//定义session缓存
static Map<String, Session> sessionMap = new Hashtable<String, Session>();
@OnOpen
/**
* 创建一个新的Session 并将该Session保存到缓存中
* @param session
*/
public void onOpen(Session session) {
sessionMap.put(session.getId(), session);
}
@OnMessage
/**
* 服务器接收到消息 然后调用广播发给所有人
* @param unscrambledWord
* @param session
*/
public void onMessage(String unscrambledWord, Session session) {
broadcastAll("message", unscrambledWord);
}
/**
* 广播给所有人
* 这里也可设置广播给指定人
* @param message
*/
public static void broadcastAll(String type, String message) {
Set<Map.Entry<String, Session>> set = sessionMap.entrySet();
for (Map.Entry<String, Session> i : set) {
try {
i.getValue().getBasicRemote().sendText("{type:'" + type + "',text:'" + message + "'}");
} catch (Exception e) {
e.printStackTrace();
}
}
}
@OnClose
/**
* 如果客户端关闭Session 则移除Session
* @param session
* @param closeReason 关闭原因
*/
public void onClose(Session session, CloseReason closeReason) {
sessionMap.remove(session.getId());
logger.info(String.format("Session %s closed because of %s",session.getId(), closeReason));
}
@OnError
/**
* 如果某个客户端异常,则移除该会话
* @param session
* @param throwable 异常信息
*/
public void error(Session session, java.lang.Throwable throwable) {
sessionMap.remove(session.getId());
System.err.println("session " + session.getId() + " error:" + throwable);
}
}