java - WebSocket 连接无异常被拒绝
问题描述
WebSocket 连接有时会毫无例外地拒绝。如果没有有关此事件的信息,就不可能重新连接。作为使用的基本库tomcat-embed-websocket-9.0.50
。@OnClose
有时@OnError
工作,我可以重新连接DisconnectHandler
,ErrorHandler
但并非总是如此,在这些情况下连接丢失但应用程序没有关于它的信息。带有订阅数据的主机服务器是一个外部外部服务,我没有关于实现的信息。数据不均匀有时有时没有,不清楚是不是因为连接丢失或根本没有实际数据。
我需要知道有关连接是否存在的实际信息。
@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));
有任何想法吗
解决方案
推荐阅读
- java - Docker compose以状态1退出,spring boot在日志中启动并立即结束,但无法确定失败原因
- assembly - 标志标志不会将值更改为“1”程序集
- rest - 我可以通过 oauth 授权在本地访问我的休息服务吗?还是必须有oauth设置才能通过邮递员运行Rest?
- c++ - >> 双精度数组的运算符?
- android - 后台 AsyncTask 需要很长时间才能完成
- laravel - 多个警卫使用一个登录页面是否安全?
- javascript - 带有相对容器或固定面板的 Jquery 可拖放 Z-Index
- python - 在变量中的python字符串上触发f-string解析
- r - 基于类型的自定义“ggplot2”扩展中的子集数据
- hive - 将日期值动态分配给配置单元查询