java - 如何正确关闭java-ee websocket连接

标签 java jakarta-ee websocket

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

我不确定自己做错了什么,也不知道为什么会出现这个异常。

最佳答案

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

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

我的解决方案不是让服务器关闭 session ,而是向客户端发送一条消息“youquit”,然后让客户端调用 session.close。

服务器现在收到关闭事件并准备好进行下一次连接,客户端无一异常(exception)地结束。

@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 入口点关闭连接。

关于java - 如何正确关闭java-ee websocket连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26558373/

相关文章:

java - 如何解决Java中的Broken Pipe问题?

java - 帮我把这个 Java 翻译成 Scheme 让事情在我的脑海里进行

java - 具有多线程和公共(public)资源的批处理的建议架构

java - 尝试在 QT 项目中调用 Java 代码时找不到类异常

http - HTML5 Websocket HTTP 认证失败;没有可用的有效凭据

node.js - NodeJS : What's the best way to share session between server-rendered views and React app

java - 实现与多个 EJB 的接口(interface)

java - 如何将并行进程同步到 Web 服务中?

java - Spring 安全: At which point do I get to know that a user logged in?

websocket - 如何通过 websockets 连接到 RSK 节点?