我正在使用java-ee websockets实现一个小聊天应用程序。
有一次,我想关闭一个客户端的会话,因为各种原因,所以关闭连接。
为了关闭连接,我调用了onClose函数,在该函数中我调用了session.close(),但在那之后,我得到了以下错误:
java.lang.IllegalStateException: The WebSocket session has been closed and no method (apart from close()) may be called on a closed session
at org.apache.tomcat.websocket.WsSession.checkState(WsSession.java:643)
at org.apache.tomcat.websocket.WsSession.addMessageHandler(WsSession.java:168)
at org.apache.tomcat.websocket.pojo.PojoEndpointBase.doOnOpen(PojoEndpointBase.java:81)
at org.apache.tomcat.websocket.pojo.PojoEndpointServer.onOpen(PojoEndpointServer.java:70)
at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.init(WsHttpUpgradeHandler.java:129)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:629)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)我不确定我做错了什么,也不知道为什么我会得到这个异常。
发布于 2017-02-11 06:59:39
当我今天开始学习这些东西时,我也有同样的问题。
到目前为止,我发现在服务器上的注释@OnMessage处,当服务器通过调用session.close接收到"quit“消息时,我正在关闭连接。然后,在@OnMessage的末尾,我发出了强制的返回,因为该方法需要一个返回,而正是返回抛出了异常,因为会话已经关闭了。
我的解决方案不是让服务器关闭会话,而是向客户端发送一条消息"youquit“,让客户端调用session.close。
服务器现在接收到close事件,并为下一次连接做好准备,而客户端则无异常地结束。
@OnMessage
public String onMessage(String message, Session session) throws DeploymentException, IOException {
switch (message) {
case "quit":
//session.close(new CloseReason(CloseCodes.NORMAL_CLOSURE, "Game ended"));
message = "you" + message;
break;
}
return message;
}
@OnClose
public void onClose(Session session, CloseReason closeReason) {
logger.info(String.format("Session %s closed because of %s", session.getId(), closeReason));
}我试图在返回层捕获异常,但它不起作用。
我现在相信您不能在@OnMessage入口点关闭连接。
发布于 2015-09-25 17:21:35
这似乎是由于现在已经修复的一个错误:https://github.com/Atmosphere/atmosphere/issues/1770
发布于 2014-10-25 15:31:15
当会话关闭时调用Websocket OnClose方法,你不需要关闭会话。您希望关闭已关闭的会话。此错误显示该会话已关闭。你可以从这里看到它:
http://docs.oracle.com/javaee/7/api/javax/websocket/Session.html
会话关闭后,应用程序将无法再使用该会话。一旦会话关闭,调用它的任何方法( close()方法除外)都将导致抛出IllegalStateException。开发人员应该在Endpoint.onClose(javax.websocket.Session,javax.websocket.CloseReason)方法期间从会话中检索任何信息。按照Closeable的约定,在会话关闭后调用会话close()方法没有任何效果。
https://stackoverflow.com/questions/26558373
复制相似问题