服务端库依赖详见章末
spring websocket服务端代码(会话过程)
public class HandshakeInterceptor extends HttpSessionHandshakeInterceptor {
private static final Logger logger = LoggerFactory.getLogger(HandshakeInterceptor.class);
//会话开始
@Override
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {
attributes.put(Constant.WEBSOCKET_USERNAME,"LSH");
// 从session中获取用户
/*if (request instanceof ServletServerHttpRequest) {
ServletServerHttpRequest serverHttpRequest = (ServletServerHttpRequest) request;
HttpSession session = serverHttpRequest.getServletRequest().getSession(false);
if (session!=null) {
String username = (String) session.getAttribute(Constant.SESSION_USERNAME);
attributes.put(Constant.WEBSOCKET_USERNAME,username);
}
}*/
return true;
}
//会话结束
@Override
public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception ex) {
System.out.println("After Handshake");
super.afterHandshake(request, response, wsHandler, ex);
}
}
服务端websocket消息处理
import com.beesgame.sanguo.constant.Constant;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;
import java.io.IOException;
import java.util.ArrayList;
/**
* Created by hackway on
* Date: 2016/1/15.
* Time:11:15
*/
public class WebSocketEndPoint extends TextWebSocketHandler {
private static final ArrayList<WebSocketSession> users;
private static final Logger logger;
static {
users = new ArrayList<WebSocketSession>();
logger = LoggerFactory.getLogger(WebSocketEndPoint.class);
}
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
super.handleTextMessage(session, message);
TextMessage returnMessage = new TextMessage(message.getPayload()+" received at server");
session.sendMessage(returnMessage);
}
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
logger.info("connect to the websocket success......");
//添加用户到session
users.add(session);
String username = (String) session.getAttributes().get(Constant.WEBSOCKET_USERNAME);
if (username!=null) {
session.sendMessage(new TextMessage("用户名:"+username));
}
}
@Override
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
if (session.isOpen()) {
session.close();
}
logger.info("websocket transport error, connection closed......");
users.remove(session);
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
logger.info("websocket connection closed......");
users.remove(session);
}
@Override
public boolean supportsPartialMessages() {
return super.supportsPartialMessages();
}
// 发送信息给特定用户(LSH)
public void sendMessageToUser(String username, TextMessage message) {
for (WebSocketSession user:users) {
if (user.getAttributes().get(Constant.WEBSOCKET_USERNAME).equals