1、WebSocketConfigurer
/**
* WebSocketConfig 配置
*
* @author shaoying.c
* @CreateDate 2017/8/21 15:31
**/
@Configuration
@EnableWebMvc
@EnableWebSocket
public class WebsocketConfig implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
//支持websocket访问的链接
registry.addHandler ( new WebSocketHandler (),"/echo" ).addInterceptors ( new HandshakeInterceptor () );
//withSockJS()表示支持socktJS访问,在浏览器中使用
registry.addHandler ( new WebSocketHandler (),"/sockjs/echo" ).addInterceptors ( new HandshakeInterceptor () ).withSockJS ();
}
}
2、实现WebSocketConfig 中配置的HandshakeInterceptor握手
/**
* 创建握手(handshake)
*
* @author shaoying.c
* @CreateDate 2017/8/16 15:41
**/
public class HandshakeInterceptor implements org.springframework.web.socket.server.HandshakeInterceptor {
Logger logger = LoggerFactory.getLogger ( HandshakeInterceptor.class );
//初次握手前
@Override
public boolean beforeHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Map <String, Object> map) throws Exception {
logger.info ( "握手前处理。。。" );
if (serverHttpRequest instanceof ServletServerHttpRequest) {
ServletServerHttpRequest request = (ServletServerHttpRequest) serverHttpRequest;
HttpSession session = request.getServletRequest ().getSession (false);
if (null != session) {
String orderNo = (String) session.getAttribute ( "orderNo" );
if (null != orderNo) {
map.put ( "orderNo", orderNo );
} else {
return false;
}
}
}
return true;
}
//初次握手后
@Override
public void afterHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Exception e) {
}
}
3、实现WebSocketConfig中配置的WebSocketHandler
/**
* WebSocketHandler 消息处理中心
*
* @author shaoying.c
* @CreateDate 2017/8/21 15:37
**/
public class WebSocketHandler implements org.springframework.web.socket.WebSocketHandler {
Logger logger = LoggerFactory.getLogger ( WebSocketHandler.class );
private static final ArrayList<WebSocketSession> users = new ArrayList<> ();
private PayCommonUtil payCommonUtil ;
public static final Map<String, WebSocketSession> userSocketSessionMap ;
static {
userSocketSessionMap = new HashMap<> ( );
}
//初次连接成功执行
@Override
public void afterConnectionEstablished(WebSocketSession webSocketSession) throws Exception {
logger.info ( "初次连接成功,初始化...." );
String orderNo = (String) webSocketSession.getHandshakeAttributes ().get ( "orderNo" );
if (null != orderNo) {
userSocketSessionMap.put ( orderNo,webSocketSession );
}
}
//接受消息处理消息
@Override
public void handleMessage(final WebSocketSession webSocketSession, WebSocketMessage<?> webSocketMessage) throws Exception {
//获取提交过来的消息
final String message = (String) webSocketMessage.getPayload ();
logger.info ("===========message=========" + message);
if (webSocketSession.isOpen ()) {
new Thread ( new Runnable () {
@Override
public void run() {
try {
Map<String,String> map = WXOrderQuery ( message );
if ("1".equals ( map.get ( "RESULT_CODE" ) )) {
if (webSocketSession.isOpen ()) {
webSocketSession.sendMessage ( new TextMessage ( "1" ) );
}
}
} catch (Exception e) {
e.printStackTrace ();
}
}
} );
}
}
//连接出错处理
@Override
public void handleTransportError(WebSocketSession webSocketSession, Throwable throwable) throws Exception {
logger.error ( "websocket连接出错" );
//如果websocket开启,链接出错将其关闭
if (webSocketSession.isOpen ()) {
webSocketSession.close ();
}
Iterator <Map.Entry <String, WebSocketSession>> it = userSocketSessionMap
.entrySet().iterator();
// 移除Socket会话
while (it.hasNext()) {
Map.Entry <String, WebSocketSession> entry = it.next();
if (entry.getValue().getId().equals(webSocketSession.getId ())) {
userSocketSessionMap.remove(entry.getKey());
logger.info ("Socket会话已经移除:用户ID" + entry.getKey());
break;
}
}
}
//连接关闭后处理
@Override
public void afterConnectionClosed(WebSocketSession webSocketSession, CloseStatus closeStatus) throws Exception {
logger.info ( "websocket连接关闭!" );
//连接关闭
Iterator<Map.Entry <String, WebSocketSession>> it = userSocketSessionMap.entrySet ().iterator ();
while (it.hasNext ()) {
Map.Entry<String, WebSocketSession> entry = it.next ();
if (entry.getValue ().getId ().equals ( webSocketSession.getId () )) {
userSocketSessionMap.remove ( entry.getKey () );
logger.info ( "socket连接已关闭!" );
break;
}
}
}
@Override
public boolean supportsPartialMessages() {
return false;
}
/**
* 给所有用户发送消息
*/
public void sendMessageAll(final String message){
Iterator<Map.Entry<String, WebSocketSession>> it = userSocketSessionMap
.entrySet().iterator();
while (it.hasNext ()) {
final Map.Entry<String,WebSocketSession> entry = it.next ();
if (entry.getValue ().isOpen ()) {
new Thread ( new Runnable () {
@Override
public void run() {
try {
Map<String,String> map = WXOrderQuery(message);
if ("1".equals ( map.get ( "RESULT_CODE" ) )) {
if (entry.getValue ().isOpen ()) {
entry.getValue ().sendMessage ( new TextMessage ( "1" ) );
}
}
} catch (Exception e) {
e.printStackTrace ();
}
}
} );
}
}
}
}