首页 > 解决方案 > WebSocket 连接无异常被拒绝

问题描述

WebSocket 连接有时会毫无例外地拒绝。如果没有有关此事件的信息,就不可能重新连接。作为使用的基本库tomcat-embed-websocket-9.0.50@OnClose有时@OnError工作,我可以重新连接DisconnectHandlerErrorHandler但并非总是如此,在这些情况下连接丢失但应用程序没有关于它的信息。带有订阅数据的主机服务器是一个外部外部服务,我没有关于实现的信息。数据不均匀有时有时没有,不清楚是不是因为连接丢失或根本没有实际数据。

我需要知道有关连接是否存在的实际信息。

@ClientEndpoint
public class WebsocketConnection {

    private final MessageHandler messageHandler;
    private final ConnectHandler connectHandler;
    private final DisconnectHandler disconnectHandler;
    private final ErrorHandler errorHandler;

    private Session session = null;

    public WebsocketConnection(URI uri,
                               MessageHandler msgHandler,
                               ConnectHandler connectHandler,
                               DisconnectHandler disconnectHandler,
                               ErrorHandler errorHandler) {
        this.messageHandler = msgHandler;
        this.connectHandler = connectHandler;
        this.disconnectHandler = disconnectHandler;
        this.errorHandler = errorHandler;
        this.ignorePatterns = ignPatterns;
        try {
            WebSocketContainer container = ContainerProvider.getWebSocketContainer();
            container.connectToServer(this, uri);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    @OnOpen
    public void onOpen(Session newSession) {
        session = newSession;
        // sessionObserve();
        connectHandler.onConnect(newSession);
    }

    @OnMessage
    public void onMessage(String message) {
        messageHandler.onMessage(message);
    }

    @OnClose
    public void onClose(Session expiredSession, CloseReason closeReason) {
        disconnectHandler.onDisconnect(expiredSession, closeReason);
    }

    @OnError
    public void onError(Throwable t) {
        errorHandler.onError(t);
    }
}

public interface ConnectHandler {
    void onConnect(Session newSession);
}
public interface DisconnectHandler {
    void onDisconnect(Session session, CloseReason disconnectReason);
}
public interface ErrorHandler {
    void onError(Throwable t);
}
public interface MessageHandler {
    void onMessage(String msgJson);
}

对于测试记录会话状态,我正在尝试使用如下代码:

private void sessionObserve() {
    TimerTask timerTask = new TimerTask() {
        @Override
        public void run() {
            if (session != null) {
                System.out.println(session.isOpen());
            }
        }
    };
    new Timer().schedule(timerTask, 0, 3000);
}

调用它onOpen但几分钟后session.isOpen()true但数据已经不进入,并且@OnMessage不给回调。

用法:

new WebsocketConnection(new URI(url), 
        (msgJson) -> System.out.println(msgJson), 
        (newSession) -> System.out.println(newSession), 
        (session, disconnectReason) -> {
            System.out.println(session);
            System.out.println(disconnectReason);
        }, 
        (throwable) -> System.out.println(throwable));

有任何想法吗

标签: javawebsocket

解决方案


推荐阅读