如何保持在websockets发送消息,即使当网络关闭



我正在使用java实现的websockets(org.java_websocket)。我使用"ifconfig 10 down"来模拟网络故障。我希望服务器继续发送消息,即使当网络关闭和重新发送它们(通过tcp机制)一旦网络再次启动。但是,java实现在send函数

中进行了以下检查
private void send( Collection<Framedata> frames ) {
    if( !isOpen() )
        throw new WebsocketNotConnectedException();

导致

an error occured
close a stream
Exception in thread "main" org.java_websocket.exceptions.WebsocketNotConnectedException

当我模拟服务器和客户端之间的连接丢失时。

因为我在websockets中没有正确调用close()函数,我觉得TCP机制应该在超时导致websockets层关闭连接之前工作一段时间。我在期待什么外在的东西吗?有一个实现可以帮助我吗?

通过ifconfig down模拟网络连接问题不是一个好主意,因为操作系统知道接口状态。操作系统可能(它确实)以不同的方式处理连接错误和接口错误,网络应用程序得到不同的错误指示。

在linux机器上模拟连接错误的一个选项是iptables。假设您的应用程序使用端口80。你可以通过

删除所有与80端口之间的通信
iptables -A INPUT -p tcp --destination-port 80 -j DROP
iptables -A OUTPUT -p tcp --source-port 80 -j DROP

iptables中的流量下降就像网络中断一样处理。

我认为这里的测试设置并没有真正做到您想要的。我想发生的事情是,只要你使用ifconfig操作系统是聪明的,足以查找哪些套接字绑定到这个接口,并关闭它们。因此,Java和websocket应用程序得到关于关闭套接字的通知,并且websocket连接被清理。

您可能需要另一种方法来模拟"未插入"连接,因为您希望看到高数据包丢失/延迟,但没有实际的连接关闭通知。

现在回答这个问题已经太晚了,但我想我的答案可以帮助其他人:你应该使用

connectBlocking() 

代替

connect()

函数。注意,connectBlocking()会阻塞你的线程!

相关内容

  • 没有找到相关文章

最新更新