关于websocket 的连接问题

hupuer 2018-02-28 09:36:24
今天刚接触 websocket ,使用websocket一连接到服务器 马上就断开了。
这是什么问题啊。
...全文
816 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiongdejun 2018-03-01
  • 打赏
  • 举报
回复
把代码贴出来 鬼知道你怎么写的啊,
hupuer 2018-03-01
  • 打赏
  • 举报
回复
引用 1 楼 xiongdejun 的回复:
把代码贴出来 鬼知道你怎么写的啊,
jsp部分 <%@ page contentType="text/html;charset=UTF-8" language="java" %> <% String path = request.getContextPath();%> <% String socketPath = request.getServerName()+":"+request.getServerPort()+path+"/"; %> <html> <head> <title>Title</title> </head> <body> <h2>当前登录用户:${userName}</h2> 消息:<input type="text" id="send"> <button onclick="sendMessage()">发送</button> </body> <script src="${pageContext.request.contextPath}/resources/js/jquery.min.js"></script> <script type="text/javascript"> var socketPath = "<%=socketPath%>"; var webSocket = new WebSocket("ws://"+socketPath+"/ws"); webSocket.onopen = function(event){ console.log("连接成功"); console.log(event); alert(webSocket.readyState); }; webSocket.onerror = function(event){ console.log("连接失败"); console.log(event); }; webSocket.onclose = function(event){ console.log("Socket连接断开"); console.log(event); }; webSocket.onmessage = function(event){ //接受来自服务器的消息 //... var message = JSON.parse(event.data);//将数据解析成JSON形式 $("#send").val(message.messageText); }; function sendMessage() { var sendUid = 1; var sendName = "xiaoma"; var toId = 2; var data = {};//新建data对象,并规定属性名与相应的值 data['fromId'] = sendUid; data['fromName'] = sendName; data['toId'] = toId; data['messageText'] = $("#send").val(); webSocket.send(JSON.stringify(data));//将对象封装成JSON后发送至服务器 }; </script> </html> 配置文件 MyWebSocketConfig @Component @EnableWebSocket public class MyWebSocketConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer { @Autowired private MyWebSocketHandler handler; @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry webSocketHandlerRegistry) { //添加websocket处理器,添加握手拦截器 webSocketHandlerRegistry.addHandler(handler, "/ws").addInterceptors(new MyHandShakeInterceptor()); //添加websocket处理器,添加握手拦截器 webSocketHandlerRegistry.addHandler(handler, "/ws/sockjs").addInterceptors(new MyHandShakeInterceptor()).withSockJS(); } } 拦截器 MyHandShakeInterceptor.java public class MyHandShakeInterceptor implements HandshakeInterceptor { @Override public boolean beforeHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> map) throws Exception { System.out.println("Websocket:用户[ID:" + ((ServletServerHttpRequest) serverHttpRequest).getServletRequest().getSession(false).getAttribute("user") + "]已经建立连接"); if (serverHttpRequest instanceof ServletServerHttpRequest) { ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) serverHttpRequest; HttpSession session = servletRequest.getServletRequest().getSession(false); // 标记用户 User user = (User) session.getAttribute("user"); if(user!=null){ map.put("uid", user.getId());//为服务器创建WebSocketSession做准备 System.out.println("用户id:"+user.getId()+" 被加入"); }else{ System.out.println("user为空"); return false; } } return true; } @Override public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) { } } 消息处理 MyWebSocketHandler.java @Component public class MyWebSocketHandler implements WebSocketHandler { //当MyWebSocketHandler类被加载时就会创建该Map,随类而生 public static final Map<Integer, WebSocketSession> userSocketSessionMap; static { userSocketSessionMap = new HashMap<Integer, WebSocketSession>(); } //握手实现连接后 public void afterConnectionEstablished(WebSocketSession webSocketSession) throws Exception { int uid = (Integer) webSocketSession.getAttributes().get("uid"); if (userSocketSessionMap.get(uid) == null) { userSocketSessionMap.put(uid, webSocketSession); } System.out.println("握手实现连接后"); } //发送信息前的信息处理 public void handleMessage(WebSocketSession webSocketSession, WebSocketMessage<?> webSocketMessage) throws Exception { if(webSocketMessage.getPayloadLength()==0)return; //得到Socket通道中的数据并转化为Message对象 Message msg=new Gson().fromJson(webSocketMessage.getPayload().toString(),Message.class); Timestamp now = new Timestamp(System.currentTimeMillis()); msg.setMessageDate(now); //发送Socket信息 sendMessageToUser(msg.getToId(), new TextMessage(new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create().toJson(msg))); } @Override public void handleTransportError(WebSocketSession webSocketSession, Throwable exception) throws Exception { } public void afterConnectionClosed(WebSocketSession webSocketSession, CloseStatus closeStatus) throws Exception { System.out.println("WebSocket:"+webSocketSession.getAttributes().get("uid")+"close connection"); Iterator<Map.Entry<Integer,WebSocketSession>> iterator = userSocketSessionMap.entrySet().iterator(); while(iterator.hasNext()){ Map.Entry<Integer,WebSocketSession> entry = iterator.next(); if(entry.getValue().getAttributes().get("uid")==webSocketSession.getAttributes().get("uid")){ userSocketSessionMap.remove(webSocketSession.getAttributes().get("uid")); System.out.println("WebSocket in staticMap:" + webSocketSession.getAttributes().get("uid") + "removed"); } } } @Override public boolean supportsPartialMessages() { return false; } //发送信息的实现 public void sendMessageToUser(int uid, TextMessage message) throws IOException { WebSocketSession session = userSocketSessionMap.get(uid); if (session != null && session.isOpen()) { session.sendMessage(message); } } }

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧