停止 WebSocket 发送数据

Stopping a WebSocket from sending data

我正在使用 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 循环中放置什么来终止数据发送而不抛出异常?

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

您永远不会 return 来自 onConnect,这是强制性的。

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

检测到关闭后会话将失效。来自有效的关闭握手,或来自异常关闭,或来自苛刻的关闭。

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