今天刚接触 websocket ,使用websocket一连接到服务器 马上就断开了。
这是什么问题啊。

解决方案 »

  1.   

    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);
            }
        }
    }