停止 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()) { }
作为额外的保护措施,但请记住,它还需要处理更多传入帧的能力。
我正在使用 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()) { }
作为额外的保护措施,但请记住,它还需要处理更多传入帧的能力。