Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何正确关闭JavaEEWebSocket连接_Java_Jakarta Ee_Websocket - Fatal编程技术网

如何正确关闭JavaEEWebSocket连接

如何正确关闭JavaEEWebSocket连接,java,jakarta-ee,websocket,Java,Jakarta Ee,Websocket,我正在使用java ee WebSocket实现一个小型聊天应用程序。 由于各种原因,我一度想关闭客户端的会话,以便关闭连接。 为了关闭连接,我调用了onClose函数,并在该函数中调用了session.close(),但在这之后,我得到了以下错误: java.lang.IllegalStateException: The WebSocket session has been closed and no method (apart from close()) may be called on a

我正在使用java ee WebSocket实现一个小型聊天应用程序。
由于各种原因,我一度想关闭客户端的会话,以便关闭连接。
为了关闭连接,我调用了
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)

我不知道我做错了什么,也不知道为什么我会得到这个例外

Websocket OnClose方法在会话关闭时调用,您不需要关闭会话。您需要关闭关闭的会话。此错误表明会话已关闭。您可以从这里看到:

一旦会话关闭,它就不再对用户有效 应用。调用它的任何方法(除了 close()方法)一旦会话关闭,将导致 正在引发非法状态异常。开发人员应该检索任何 会议期间会议的信息 onClose(javax.websocket.Session,javax.websocket.CloseReason) 方法。遵循可关闭调用会话的约定 会话关闭后的close()方法无效


这似乎是由于一个现已修复的错误造成的:

检查会话是否打开,如果打开则关闭会话

if(session.isOpen()){
    session.close();
}

我今天开始学习这些东西的时候也遇到了同样的问题

到目前为止,我发现在注释@OnMessage的服务器上,当服务器通过调用session.close收到“quit”消息时,我正在关闭连接。 然后在@OnMessage的末尾,我发出了一个强制的返回,因为该方法需要一个返回,而正是该返回引发了异常,因为会话已经关闭

我的解决方案是不让服务器关闭会话,而是向客户端发送消息“youquit”,让客户端调用session.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入口点关闭连接。

正如blockquote所说的“一旦会话关闭,调用其任何方法(close()方法除外)将导致抛出非法状态异常”,但它在调用会话时抛出非法状态异常。close()您确定会话关闭后不调用其他方法吗?调试项目了吗?我要做的就是从服务器端强制关闭会话,这就是为什么我调用session.close()。当客户端被中断时,服务器上没有OnClose触发器,至少对于Tomcat 9,可能还有很多其他触发器。如果客户端结束连接,则引发EndOfFile错误。我在一个错误中发现了这一点,并关闭了那里的连接。我认为这与本案无关。OP似乎直接使用JSR356 websocket API,而不是通过Atmosphere框架。。你知道问题出在哪里了吗?如何正确处理?我现在在Tomcat7上也有同样的问题