Spring Boot Websocket IOException:网络缓冲区中的剩余数据,can';无法发送SSL关闭消息

Spring Boot Websocket IOException:网络缓冲区中的剩余数据,can';无法发送SSL关闭消息,websocket,Websocket,我的Websocket断开连接,无法在浏览器的javascript客户端接收任何数据。 我在Spring应用程序中使用JSR-356,在客户端使用vanilla javascript websocket package com.crl.nms.controller; import java.io.IOException; import java.util.Collections; import java.util.HashSet; import java.util.Set; import j

我的Websocket断开连接,无法在浏览器的javascript客户端接收任何数据。 我在Spring应用程序中使用JSR-356,在客户端使用vanilla javascript websocket

package com.crl.nms.controller;

import java.io.IOException;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

import org.springframework.web.socket.server.standard.SpringConfigurator;

@ServerEndpoint(value = "/IntrusionWebsocketEndPoint", configurator = SpringConfigurator.class)
public class IntrusionWebsocketEndPoint {
    private static Set<Session> allSessions = Collections.synchronizedSet(new HashSet<Session>());

    @OnOpen
    public void onOpen(Session session) throws IOException {
        // Get session and WebSocket connection
        // System.out.println("IntrusionWebsocketEndPoint WebSocket Opened - session id
        // : " + session.getId());

        //session.setMaxIdleTimeout(new Long("999999999"));

        session.setMaxTextMessageBufferSize(64 * 1024*2);
        //session.setMaxBinaryMessageBufferSize(64 * 1024*2);
        allSessions.add(session);
    }

    @OnMessage
    public void onMessage(Session session, String message) throws IOException {
        // Handle new messages

        // System.out.println("RECEIVED MESSAGE " + message);
        // MessageProcessor.Process(message);
        MiddlewareWebsocketEndPoint.sendMessage(message);
    }

    @OnClose
    public void onClose(Session session) throws IOException {
        // WebSocket connection closes
        // System.out.println("IntrusionWebsocketEndPoint WebSocket Closed - session id
        // : " + session.getId());
        allSessions.remove(session);

    }

    @OnError
    public void onError(Session session, Throwable throwable) {
        // Do error handling here
        System.out.println("IntrusionWebsocketEndPoint Erorr in session" + session.getId() + " Error is "
                + throwable.getMessage());
        // allSessions.remove(session);

    }

    // custom made by us
    public static void sendMessage(String message) {

        // System.out.println("IntrusionWebsocketEndPoint SENT MESSAGE " + message);

        for (Session sess : allSessions) {
            try {
                // System.out.println("Sending Trains Track data to client with session id
                // "+sess.getId());
                // sess.getBasicRemote().sendText(message);

                synchronized (sess) {
                    if (sess.isOpen())
                        sess.getBasicRemote().sendText(message);
                }

                // sess.getBasicRemote().sendObject(jsonObject);;
            } catch (IOException ioe) {
                System.out.println(ioe.getMessage());
            } catch (Exception ex) {
                System.out.println(ex.getMessage());
            }
        }
    }
}
包com.crl.nms.controller;
导入java.io.IOException;
导入java.util.Collections;
导入java.util.HashSet;
导入java.util.Set;
导入javax.websocket.OnClose;
导入javax.websocket.OnError;
导入javax.websocket.OnMessage;
导入javax.websocket.OnOpen;
导入javax.websocket.Session;
导入javax.websocket.server.ServerEndpoint;
导入org.springframework.web.socket.server.standard.SpringConfigurator;
@ServerEndpoint(value=“/IntrusionWebsocketEndPoint”,configurator=SpringConfigurator.class)
公共类入侵WebSocketEndpoint{
private static Set allSessions=Collections.synchronizedSet(new HashSet());
@奥诺彭
public void onOpen(会话)引发IOException{
//获取会话和WebSocket连接
//System.out.println(“IntrusionWebsocketEndPoint WebSocket已打开-会话id
//:“+session.getId());
//setMaxIdleTimeout(新长(“99999999”);
session.setMaxTextMessageBufferSize(64*1024*2);
//session.setMaxBinaryMessageBufferSize(64*1024*2);
添加(会话);
}
@OnMessage
public void onMessage(会话、字符串消息)引发IOException{
//处理新消息
//System.out.println(“收到的消息”+消息);
//MessageProcessor.Process(消息);
MiddlewareWebsocketEndPoint.sendMessage(消息);
}
@一次
public void onClose(会话)引发IOException{
//WebSocket连接关闭
//System.out.println(“入侵WebSocketEndpoint WebSocket关闭-会话id
//:“+session.getId());
所有会话。删除(会话);
}
@一个错误
公共作废申报人(会话,可丢弃){
//请在此处执行错误处理
System.out.println(“会话中的入侵WebSocketEndpoint Erorr”+会话.getId()+“错误为”
+throwable.getMessage());
//所有会话。删除(会话);
}
//我们定制的
公共静态无效发送消息(字符串消息){
//System.out.println(“IntrusionWebsocketEndPoint发送消息”+消息);
对于(会话sess:所有会话){
试一试{
//System.out.println(“使用会话id向客户端发送列车轨道数据
//“+sess.getId());
//sess.getBasicRemote().sendText(消息);
同步(sess){
if(sess.isOpen())
sess.getBasicRemote().sendText(消息);
}
//sess.getBasicRemote().sendObject(jsonObject);;
}捕获(ioe异常ioe){
System.out.println(ioe.getMessage());
}捕获(例外情况除外){
System.out.println(例如getMessage());
}
}
}
}
我收到这个错误

信息[https-jsse-nio-9443-exec-75]org.apache.tomcat.websocket.server.WsRemoteEndpointImplServer.doClose无法干净地关闭ServletOutputStream连接 java.io.IOException:网络缓冲区中的剩余数据,无法发送SSL关闭消息,而是使用close(true)强制关闭 位于org.apache.tomcat.util.net.SecureNioChannel.close(SecureNioChannel.java:511) 位于org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.close(NioEndpoint.java:1126) 位于org.apache.tomcat.websocket.server.WsRemoteEndpointImplServer.doClose(WsRemoteEndpointImplServer.java:166) 位于org.apache.tomcat.websocket.WsRemoteEndpointImplBase.close(WsRemoteEndpointImplBase.java:710) 在org.apache.tomcat.websocket.WsSession.sendCloseMessage(WsSession.java:599)上 位于org.apache.tomcat.websocket.WsSession.doClose(WsSession.java:480) 位于org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendMessageBlock(WsRemoteEndpointImplBase.java:313) 位于org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendMessageBlock(WsRemoteEndpointImplBase.java:250) 位于org.apache.tomcat.websocket.WsRemoteEndpointImplBase.sendString(WsRemoteEndpointImplBase.java:191) 位于org.apache.tomcat.websocket.WsRemoteEndpointBasic.sendText(WsRemoteEndpointBasic.java:37) 位于com.crl.nms.controller.IntrusionWebsocketEndPoint.sendMessage(IntrusionWebsocketEndPoint.java:74) 在com.crl.nms.controller.MiddlewareWebsocketEndPoint.onMessage(MiddlewareWebsocketEndPoint.java:105)上 位于sun.reflect.GeneratedMethodAccessor173.invoke(未知源) 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中 位于java.lang.reflect.Method.invoke(Method.java:498) 位于org.apache.tomcat.websocket.pojo.PojoMessageHandlerWholeBase.onMessage(PojoMessageHandlerWholeBase.java:80) 位于org.apache.tomcat.websocket.WsFrameBase.sendMessageText(WsFrameBase.java:395) 位于org.apache.tomcat.websocket.server.WsFrameServer.sendMessageText(WsFrameServer.java:119) 位于org.apache.tomcat.websocket.WsFrameBase.processDataText(WsFrameBase.java:495) 位于org.apache.tomcat.websocket.WsFrameBase.processData(WsFrameBase.java:294) 位于org.apache.tomcat.websocket.WsFrameBase.processInputBuffer(WsFrameBase.java:133) 位于org.apache.tomcat.websocket.server.WsFrameServer.onDataAvailable(WsFrameServer.java:82) 位于org.apache.tomcat.websocket.server.WsFrameServer.doOnDataAvailable(WsFrameServer.java:171) 位于org.apache.tomcat.websocket.server.WsFrameServer.notifyDataAvailable(WsFrameServer.java:151) 位于org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.upgradeDispatch(WsHttpUpgradeHandler.java:148) 位于org.apache.coyote.http11.upgrade.UpgradeProcessorInternal.dispatch(UpgradeProcessorInternal.java:54) 位于org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:53) 位于org.apache.coyote.AbstractProtocol$ConnectionHandler.process(