这几天项目中需要整合websocket来支持业务,从网上看了好多资料。但是都很杂乱,我尝试了好多回,走了很多弯路,跳了很多坑~~~~~~。通过两天的调试终于成功!!!现在把调试步骤和容易出现的问题都列出来,让和我这样的新手有点帮助。开始上代码.........
【备注:spring的版本4.0+ ,tomcat :7.50 + , jdk:1.8】
java Spring 整合 websocket 有两种方法 :
1:配置方法 [网上有很多]
(地址:http://blog.csdn.net/stickallthetime/article/details/44587413 这位大哥写的很详细)
2:注解方法 [推荐使用这种方法,简洁。我用的就是这种方法]
第一步:pom文件添加jar包
第二步:添加 websocket 配置
@Configuration
@EnableWebMvc
@EnableWebSocket
public class WebSocketConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer{
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
System.out.println("......注册......");
//这个类的标红的代码 解释 问题2
//配置webSocket路径
registry.addHandler(systemWebSocketHandler(),"/websocket").addInterceptors(new MyHandshakeInterceptor()).setAllowedOrigins("*");
//配置webSocket路径 支持前端使用socketJs
registry.addHandler(systemWebSocketHandler(), "/sockjs/websocket").setAllowedOrigins("*").addInterceptors(new MyHandshakeInterceptor()).withSockJS();
}
@Bean
public WebSocketHandler systemWebSocketHandler(){
System.out.println("......创建WebSocketHandler......");
return new SystemWebSocketHandler();
}
}
public class MyHandshakeInterceptor extends HttpSessionHandshakeInterceptor{
@Override
public boolean beforeHandshake(ServerHttpRequest request,
ServerHttpResponse response, WebSocketHandler wsHandler,
Map
logger.info("Before Handshake");
//获得 session 和request对象(解释问题3)
ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request;
//获得session
// HttpSession session = servletRequest.getServletRequest().getSession(false);
//获得httpServletRequest
HttpServletRequest httpRequest = servletRequest.getServletRequest();
return super.beforeHandshake(request, response, wsHandler, attributes);
}
@Override
public void afterHandshake(ServerHttpRequest request,
ServerHttpResponse response, WebSocketHandler wsHandler,
Exception ex) {
logger.info("After Handshake");
super.afterHandshake(request, response, wsHandler, ex);
}
}
public class SystemWebSocketHandler implements WebSocketHandler {
public SystemWebSocketHandler(){}
private static final ArrayList
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
System.out.println("......连接之后After......"+"ConnectionEstablished");
System.out.println("getId:" + session.getId());
System.out.println("getLocalAddress:" + session.getLocalAddress().toString());
System.out.println("getUri:" + session.getUri().toString());
System.out.println("getPrincipal:" + session.getPrincipal());
//连接进来的用户添加到用户集合中方便以后发送消息
users.add(session);
session.sendMessage(new TextMessage("你好: webSocket connect 成功!!!"));
}
@Override
public void handleMessage(WebSocketSession session, WebSocketMessage> message) throws Exception {
System.out.println("发送信息" + message.toString()+" .session. "+session.getId());
session.sendMessage(new TextMessage(message.getPayload()+"---"+ReportUtils.long2DateString(System.currentTimeMillis(), ReportUtils.FORMAT_DATE_TIME) + ""));
}
@Override
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
if(session.isOpen()){
session.close();
}
users.remove(session);
System.out.println("异常出现handleTransportError" + exception.getMessage());
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
users.remove(session);
System.out.println("关闭afterConnectionClosed" + closeStatus.getReason());
}
@Override
public boolean supportsPartialMessages() {
return false;
}
/**
* 给所有在线用户发送消息
*
* @param message
*/
public void sendMessageToUsers(TextMessage message) {
for (WebSocketSession user : users) {
try {
if (user.isOpen()) {
user.sendMessage(message);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 给指定用户发消息
* @param username
* @param message
*/
public void sendMessageToUser(String username,TextMessage message) {
for (WebSocketSession user : users) {
if (user.getAttributes().get("username").equals(username)) {
try {
if (user.isOpen()) {
user.sendMessage(message);
}
} catch (IOException e) {
e.printStackTrace();
}
break;
}
}
}
}
第三步:页面clinet
Welcome
到此websocket 已经配置完成。搭建过程中出现很多问题,下面把我遇到的问题公布一下:
问题1:
页面client 连接 websocket 的时候经常出现的问题
404:路径错误,仔细看一下。
403:先看一下路径,要是路径没问题,那看看你的项目中的filter 是不是把websocket的路劲拦截了。
400:后台肯定是报错啦,看一下什么问题,解决一下就好了。
【这三个4开头的问题大部分都是和 webSocket的路径被拦截有关系 仔细看一下filtere】
问题2:
你的项目已经跑通了,在本机也能运行起来了,但是局域网不能访问(就是localhost 能访问,但是ip地址就访问不了)
答案在 【第二步 webSocket 配置有解释 移步】
问题3:
怎么在webSocket中获得session 或者是httpServletRequest 答案在【第二步 websocket配置解释 移步】