Spring Boot Websocket IOException:网络缓冲区中的剩余数据,can';无法发送SSL关闭消息
我的Websocket断开连接,无法在浏览器的javascript客户端接收任何数据。 我在Spring应用程序中使用JSR-356,在客户端使用vanilla javascript websocketSpring 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
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(