【发布时间】:2016-01-19 09:13:45
【问题描述】:
我正在使用 Jetty 9.3.5,我想知道在发送 websocket 消息时处理不可靠连接的正确方法是什么,特别是:我注意到 websocket 连接没有正常关闭的情况,即使客户端侧向下,在服务器上触发 onClose() 需要很长时间(例如,用户关闭笔记本电脑盖并将其置于待机状态 - 可能需要 1-2 小时才能在服务器上收到关闭事件服务器端)。
因此,由于客户端仍处于注册状态,服务器会不断发送开始构建的消息。这在发送大量消息时会成为一个问题。
我已经测试过发送字节消息:
Session.getRemote().sendBytes(ByteBuffer, WriteCallback)
Session.getRemote().sendBytesByFuture(ByteBuffer);
为了在一侧模拟连接中断(即用户将笔记本电脑置于待机状态),在 Linux 上,我为 eth0 接口分配了一个 IP 地址,开始发送消息,然后将其关闭:
ifconfig eth0 192.168.1.1
ifconfig eth0 up
--- start sending messages (simple incremented numbers) and connect using Chrome browser and print them ---
ifconfig eth0 down
这样:Jetty 还在发送消息,Chrome 客户端没有收到,onClose 或 onError 没有在服务器端触发
我关于 Jetty 的问题是:
-
有没有办法清除队列中未传递的消息? 我试过了,但没有运气:
Session.getRemote().flush();
-
可以设置最大排队消息数吗? 我试过了:
WebSocketServletFactory.getPolicy().setMaxBinaryMessageBufferSize(1)
-
我可以检测客户端是否没有收到消息吗? (或者如果连接处于异常状态,比如说) 我试过了:
session.getRemote().sendBytes(bb, new WriteCallback() { @Override public void writeSuccess() { //print success } @Override public void writeFailed(Throwable arg0) { //print fail } });
但是即使没有收到消息,这也会打印成功。
我也试过用,但没找到解决办法:
factory.getPolicy().setIdleTimeout(...);
factory.getPolicy().setAsyncWriteTimeout(3000);
sendPing()
提前致谢!
【问题讨论】: