Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.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
Java Websocket服务器:处理每个会话的关闭事件_Java_Jakarta Ee_Websocket - Fatal编程技术网

Java Websocket服务器:处理每个会话的关闭事件

Java Websocket服务器:处理每个会话的关闭事件,java,jakarta-ee,websocket,Java,Jakarta Ee,Websocket,是否有方法处理每个会话的websocket的服务器端关闭事件?这就是我目前实施它的方式: @ServerEndpoint("/ws") public class WebsocketServerEndpoint { @OnOpen public void onOpen(Session session) { System.out.println("Websocket opened"); CustomWebsocketHandler handler =

是否有方法处理每个会话的websocket的服务器端关闭事件?这就是我目前实施它的方式:

@ServerEndpoint("/ws")
public class WebsocketServerEndpoint {
    @OnOpen
    public void onOpen(Session session) {
        System.out.println("Websocket opened");
        CustomWebsocketHandler handler = new CustomWebsocketHandler(session); // see below
        // ...
    }

    @OnClose
    public void onClose(Session session, CloseReason reason) {
        System.out.println("Websocket closed. Reason: " + reason);
    }
}
但我想将新的
会话
实例包装到自定义对象中。对于消息,我可以通过
addMessageHandler
将处理程序直接添加到特定会话中。但是如何在该特定会话上为
onClose
事件添加处理程序

class CustomWebsocketHandler {
    public CustomWebsocketHandler(Session session) {
        session.addMessageHandler((MessageHandler.Whole<String>) this::handleMessage);
        // How to hook up close event to handleClose()?
    }

    private void handleMessage(String message) { /* ... */ }

    private void handleClose() { /* ... */ }
}
在客户端,这很容易,因为每个连接都可以使用自己的
ClientEndpoint
-注释类实例:

webSocketContainer.connectToServer(endpointInstance, websocketURI);

服务器端是否存在类似的情况,或者是否可以干净地处理每个会话的服务器端
onClose
(最终也是
onError
)事件?

默认情况下,为每个新客户端创建
ServerEndpoint
注释类的新实例。此行为由以下方法控制:

此方法的平台默认实现在每次调用时返回一个新的端点实例,从而确保每个客户端都有一个端点实例,即默认部署基数

这意味着在
WebsocketServerEndpoint
类本身中存储特定于会话的状态是安全的,而无需手动将会话与自定义连接实例关联:

@ServerEndpoint("/ws")
public class WebsocketServerEndpoint {
    private CustomWebsocketHandler handler;

    @OnOpen
    public void onOpen(Session session) {
        handler = new CustomWebsocketHandler(session);
    }

    @OnClose
    public void onClose(Session session, CloseReason reason) {
        handler.handleClose();
    }
}

在这一点上,可能更容易让注释类
WebsocketServerEndpoint
成为所需的
CustomWebsocketHandler
本身,因为它具有相同的语义:每个连接一个实例并处理websocket事件。

默认情况下,为每个新客户端创建一个带注释类的新实例。此行为由以下方法控制:

此方法的平台默认实现在每次调用时返回一个新的端点实例,从而确保每个客户端都有一个端点实例,即默认部署基数

这意味着在
WebsocketServerEndpoint
类本身中存储特定于会话的状态是安全的,而无需手动将会话与自定义连接实例关联:

@ServerEndpoint("/ws")
public class WebsocketServerEndpoint {
    private CustomWebsocketHandler handler;

    @OnOpen
    public void onOpen(Session session) {
        handler = new CustomWebsocketHandler(session);
    }

    @OnClose
    public void onClose(Session session, CloseReason reason) {
        handler.handleClose();
    }
}
在这一点上,可能更容易让注释类
WebsocketServerEndpoint
成为所需的
CustomWebsocketHandler
本身,因为它具有相同的语义:每个连接一个实例并处理websocket事件