首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确关闭java-ee websocket连接

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

Stack Overflow用户
提问于 2014-10-25 09:08:59
回答 4查看 8.9K关注 0票数 6

我正在使用java-ee websockets实现一个小聊天应用程序。

有一次,我想关闭一个客户端的会话,因为各种原因,所以关闭连接。

为了关闭连接,我调用了onClose函数,在该函数中我调用了session.close(),但在那之后,我得到了以下错误:

代码语言:javascript
复制
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)

我不确定我做错了什么,也不知道为什么我会得到这个异常。

EN

回答 4

Stack Overflow用户

发布于 2017-02-11 06:59:39

当我今天开始学习这些东西时,我也有同样的问题。

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

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

服务器现在接收到close事件,并为下一次连接做好准备,而客户端则无异常地结束。

代码语言:javascript
复制
@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入口点关闭连接。

票数 3
EN

Stack Overflow用户

发布于 2015-09-25 17:21:35

这似乎是由于现在已经修复的一个错误:https://github.com/Atmosphere/atmosphere/issues/1770

票数 1
EN

Stack Overflow用户

发布于 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()方法没有任何效果。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26558373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档