我正在使用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。你可以通过
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()会阻塞你的线程!