websocket自动关闭连接

Dou*_*eri 67 javascript java google-chrome jetty websocket

我正在java中构建一个具有基于jetty的嵌入式websocket服务器的应用程序.客户端是Google Chrome中的默认websocket实现.只有在连接关闭一定时间后服务器和客户端之间没有传输时,一切正常.我不确定谁正在关闭连接:jetty服务器或chrome浏览器.

我认为解决方案是每隔x秒发送一条消息,但我打开了更好的解决方案.

所以......我的问题是:

  1. 这是websocket协议所需要的东西吗?在这种情况下,chrome浏览器正在关闭我的连接?

  2. 这是否与jetty相关并且或多或少与websocket协议有关?在这种情况下,如何在码头禁用此功能?

  3. 还有其他问题吗?

谢谢

更新:即使我发送1条消息/秒仍然关闭连接

Ant*_*era 39

在回答您的第三个问题时:您的客户希望能够应对临时网络问题,例如,假设用户在休眠的会议之间关闭笔记本电脑,或者网络暂时中断.

解决方案是侦听oncloseWeb套接字客户端上的事件,当它们发生时,设置客户端超时以重新打开连接,比如说:

function setupWebSocket(){
    this.ws = new WebSocket('wss://host:port/path');
    this.ws.onerror = ...;
    this.ws.onopen = ...;
    this.ws.onmessage = ...;
    this.ws.onclose = function(){
        setTimeout(setupWebSocket, 1000);
    };
}
Run Code Online (Sandbox Code Playgroud)


小智 16

您需要不时发送ping消息.我认为默认超时是300秒. 从浏览器发送websocket ping/pong框架


Leo*_*eoR 10

我发现了另一个相当快速和肮脏的解决方案.如果您使用低级方法来实现WebSocket并且您onOpen自己实现该方法,则会收到实现该WebSocket.Connection接口的对象.此对象具有可以调整的setMaxIdleTime方法.


小智 7

实际上,您可以使用WebSocketServletFactory实例在Jetty服务器端配置中设置超时间隔.例如:

WebSocketHandler wsHandler = new WebSocketHandler() {
    @Override
    public void configure(WebSocketServletFactory factory) {
        factory.getPolicy().setIdleTimeout(1500);
        factory.register(MyWebSocketAdapter.class);
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)


Dav*_*son 4

我认为您遇到的超时实际上是 TCP/IP 的一部分,解决方案是偶尔发送一次空消息。