【问题标题】:Stopping a WebSocket from sending data停止 WebSocket 发送数据
【发布时间】:2015-09-16 12:26:27
【问题描述】:

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

【问题讨论】:

    标签: embedded-jetty java-websocket


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 谢谢。我想我可以选择(1)多线程或(2)非阻塞。你能举个例子吗?
    • 实现已经是多线程的。您只是选择永远不将处理线程返回给实现。因此,实现不能再处理任何东西了。该实现在调用正常事件时不会分派到新线程,它只分派流式消息事件(JSR356 实现的一部分)
    • 对不起,我不明白你是说我做了什么(错误)或者我应该做什么(对)。你能澄清什么应该是什么不是吗?
    • 想象一下。从网络读取,然后解析 websocket 帧的线程与调用端点 .onConnect() 的线程相同,您从未从它返回,您只是进入了无限循环。该循环阻止了网络的读取和帧的解析。不要那样做。产生/分离一个新线程来处理你的写循环。
    猜你喜欢
    • 2022-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-08
    相关资源
    最近更新 更多