0

我正在使用 Jetty 的 WebSocket API 将数据流式传输到客户端。一旦客户端连接到服务端,服务端会定期向客户端发送json数据。

@WebSocket
public class WSHandler {

    // send data every 10 seconds
    public static final long PERIOD = 10000L;

    @OnWebSocketClose
    public void onClose(int statusCode, String reason) {

    }

    @OnWebSocketError
    public void onError(Throwable t) {

    }

    @OnWebSocketConnect
    public void onConnect(Session session) {
        System.out.println("Connect: " + session.getRemoteAddress().getAddress());
        try {

            while(...) {

                session.getRemote().sendString(json);

                Thread.sleep(PERIOD);

            }


        } catch (IOException | InterruptedException e ) {
            e.printStackTrace();
        }
    }

    @OnWebSocketMessage
    public void onMessage(String message) {

    }
}

我想要做的是,一旦客户端决定终止连接,服务器将停止发送 json 数据(它确实停止了,但看起来并不优雅,在服务器端抛出 EOFException、IOException 或损坏的管道或其他东西)。

我已经尝试过使用一个全局布尔变量,该变量打开false并将onClose其放置在while循环中,但这似乎不起作用。

我应该在onConnect方法的 while 循环中添加什么来终止数据的发送而不抛出异常?

4

1 回答 1

1

您的代码永远不会让主解析/事件处理线程处理其他任何事情。

你永远不会从 回来onConnect,这是强制性的。

分拆一个新线程来发送这些消息。这将允许实现处理来自远程的后续传入帧。

检测到关闭时会话将变为无效。来自有效的关闭握手,或者来自异常关闭,或者来自苛刻的关闭。

您也可以while(session.isOpen()) { }用作附加保护,但请记住,它还需要处理更多传入帧的能力。

于 2015-09-16T12:50:34.463 回答