引用1楼xiongdejun的回复:把代码贴出来鬼知道你怎么写的啊,
jsp部分
Title
当前登录用户:${userName}
消息:
发送
配置文件MyWebSocketConfig
@Component
@EnableWebSocket
publicclassMyWebSocketConfigextendsWebMvcConfigurerAdapterimplementsWebSocketConfigurer{
@Autowired
privateMyWebSocketHandlerhandler;
@Override
publicvoidregisterWebSocketHandlers(WebSocketHandlerRegistrywebSocketHandlerRegistry){
//添加websocket处理器,添加握手拦截器
webSocketHandlerRegistry.addHandler(handler,"/ws").addInterceptors(newMyHandShakeInterceptor());
//添加websocket处理器,添加握手拦截器
webSocketHandlerRegistry.addHandler(handler,"/ws/sockjs").addInterceptors(newMyHandShakeInterceptor()).withSockJS();
}
}
拦截器MyHandShakeInterceptor.java
publicclassMyHandShakeInterceptorimplementsHandshakeInterceptor{
@Override
publicbooleanbeforeHandshake(ServerHttpRequestserverHttpRequest,ServerHttpResponseresponse,WebSocketHandlerwsHandler,Mapmap)throwsException{
System.out.println("Websocket:用户[ID:"+((ServletServerHttpRequest)serverHttpRequest).getServletRequest().getSession(false).getAttribute("user")+"]已经建立连接");
if(serverHttpRequestinstanceofServletServerHttpRequest){
ServletServerHttpRequestservletRequest=(ServletServerHttpRequest)serverHttpRequest;
HttpSessionsession=servletRequest.getServletRequest().getSession(false);
//标记用户
Useruser=(User)session.getAttribute("user");
if(user!=null){
map.put("uid",user.getId());//为服务器创建WebSocketSession做准备
System.out.println("用户id:"+user.getId()+"被加入");
}else{
System.out.println("user为空");
returnfalse;
}
}
returntrue;
}
@Override
publicvoidafterHandshake(ServerHttpRequestrequest,ServerHttpResponseresponse,WebSocketHandlerwsHandler,Exceptionexception){
}
}
消息处理MyWebSocketHandler.java
@Component
publicclassMyWebSocketHandlerimplementsWebSocketHandler{
//当MyWebSocketHandler类被加载时就会创建该Map,随类而生
publicstaticfinalMap[I]userSocketSessionMap;
static{
userSocketSessionMap=newHashMap[I]();
}
//握手实现连接后
publicvoidafterConnectionEstablished(WebSocketSessionwebSocketSession)throwsException{
intuid=(Integer)webSocketSession.getAttributes().get("uid");
if(userSocketSessionMap.get(uid)==null){
userSocketSessionMap.put(uid,webSocketSession);
}
System.out.println("握手实现连接后");
}
//发送信息前的信息处理
publicvoidhandleMessage(WebSocketSessionwebSocketSession,WebSocketMessagewebSocketMessage)throwsException{
if(webSocketMessage.getPayloadLength()==0)return;
//得到Socket通道中的数据并转化为Message对象
Messagemsg=newGson().fromJson(webSocketMessage.getPayload().toString(),Message.class);
Timestampnow=newTimestamp(System.currentTimeMillis());
msg.setMessageDate(now);
//发送Socket信息
sendMessageToUser(msg.getToId(),newTextMessage(newGsonBuilder().setDateFormat("yyyy-MM-ddHH:mm:ss").create().toJson(msg)));
}
@Override
publicvoidhandleTransportError(WebSocketSessionwebSocketSession,Throwableexception)throwsException{
}
publicvoidafterConnectionClosed(WebSocketSessionwebSocketSession,CloseStatuscloseStatus)throwsException{
System.out.println("WebSocket:"+webSocketSession.getAttributes().get("uid")+"closeconnection");
Iteratoriterator=userSocketSessionMap.entrySet().iterator();
while(iterator.hasNext()){
Map.Entry[I]entry=iterator.next();
if(entry.getValue().getAttributes().get("uid")==webSocketSession.getAttributes().get("uid")){
userSocketSessionMap.remove(webSocketSession.getAttributes().get("uid"));
System.out.println("WebSocketinstaticMap:"+webSocketSession.getAttributes().get("uid")+"removed");
}
}
}
@Override
publicbooleansupportsPartialMessages(){
returnfalse;
}
//发送信息的实现
publicvoidsendMessageToUser(intuid,TextMessagemessage)
throwsIOException{
WebSocketSessionsession=userSocketSessionMap.get(uid);
if(session!=null&&session.isOpen()){
session.sendMessage(message);
}
}
} |