即使网络出现故障,如何继续在websockets中发送消息?

时间:2016-11-04 06:29:06

标签: java sockets websocket network-programming

我正在使用websockets的java实现(org.java_websocket)。我正在使用“ifconfig l0 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层关闭连接。我期待一些事情吗?有没有可以帮助我的实现?

3 个答案:

答案 0 :(得分:1)

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中的流量下降处理就像网络中断一样。

答案 1 :(得分:0)

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

您可能需要另一种方法来模拟&#34;拔掉插头&#34;连接,在你想要看到高丢包/延迟但没有实际连接关闭通知的意义上。

答案 2 :(得分:0)

回答这个问题太迟了,但是我认为我的回答可以帮助其他人: 您应该使用

connectBlocking() 

代替

connect()

功能。请注意,connectBlocking()会阻塞您的线程!