2017-07-05 69 views
1

我希望看到一个HTTP客户端如何响应连接超时,即那里的端口上监听的服务器,但建立连接的过程是如此缓慢,客户端放弃并返回一个连接超时。连接不应该被拒绝,它不应该被接受,然后在套接字超时之后。如何模拟本地端口上的网络延迟?

到目前为止,我已经尝试通过重写ServerSocket,想象我能写出像这样引入网络延迟...

public SlowServerSocket extends ServerSocket { 
    // (This method doesn't actually exist). 
    @Override 
    public void processBytesPassedOnByOperatingSystem(byte[] bytes) { 
     Thread.sleep(delay); 
     // Client has already returned a connection timeout. 
     super.processBytesPassedOnByOperatingSystem(bytes); 
    } 
} 

...但我碰到一个死胡同当我达到这个抽象层次时(它似乎隐藏在本地方法中)。我的假服务器接受连接,然后什么也不做,导致套接字超时。

我也在网上寻找解决方案,我从JMeter库中找到了SlowSocket,但它似乎在客户端使用(我认为我不能覆盖客户端所以它使用SlowSocket)。

有什么建议吗?

+0

注笔者:我发现这个答案,https://stackoverflow.com/questions/100841/artificially-create-a-connection-timeout-错误,这表明连接到不可路由的地址,如“10.255.255.1”。但是,我不确定它是最可靠的便携式解决方案。 – Pig

+0

也许值得继承'SecurityManager'并覆盖'checkAccept()'方法,使它睡眠,然后调用System.setSecurityManager(overridenSecurityManager)。想法来自这里:https://stackoverflow.com/questions/7800960/java-socket-listen-before-accept?rq=1 – Pig

回答

0

我想看看HTTP客户端如何反应连接超时,即有一个服务器侦听端口,但建立连接的过程非常慢,客户端放弃并返回连接超时。

您的需求体现在矛盾的。当对等主机完全没有响应时,通常会因为防火墙而发生连接超时。它与服务器应用程序缓慢无关。服务器不'建立连接':TCP堆栈。

连接不应该被拒绝

这不会是如果有一个听的过程中,除了下面。

它不应该被接受,然后是套接字超时。

这正是你所编写的代码会产生。

然而当且仅当服务器平台而不是Windows,还有另一种方式来产生一个连接超时:让backlog队列填满。为了达到这个目的,让服务器执行所有正常的套接字设置步骤,但根本不会调用accept(),并让客户端执行大量的连接尝试。但是如果服务器平台是Windows,这将产生连接拒绝。

+0

所以连接被拒绝时,“TCP堆栈”(对不起,我有一点知识此区域)无法连接到目标端口,因为没有进程在该端口上侦听?当TCP数据包甚至没有到达目的地/连接超时时,连接超时? – Pig

+0

@Pig如果没有监听进程,或者积压队列已满并且服务器平台是Windows,则拒绝连接。我已经说过了。连接超时,如果对方没有及时响应,或根本没有响应。我已经说过了。 – EJP

-1

我也在网上寻找解决方案,我碰到了JMeter库中的SlowSocket,但它似乎在客户端使用(我认为我不能重写客户端使它使用SlowSocket)。

可以使用Sniffy模拟网络延迟 - 它与Java的TCP协议栈无缝集成,并不需要从应用程序方面的任何变化。见documentation on emulating network issues

可在 demo.sniffy.io

在线演示 - 在右下角点击小工具,去“网络连接”选项卡并设置延迟说1000毫秒en.wikipedia.org。刷新浏览器页面,您会看到加载该页面需要1秒多的时间。 javaagent integration也适用于非Web应用程序。

enter image description here

免责声明:我的Sniffy

+0

但它模拟一个慢连接阶段?如果是这样,怎么样? – EJP

+0

TCP中的连接阶段基本上为第一个数据包增加了一个往返行程(SYN和SYN-ACK数据包不带应用程序数据,仅与ACK数据包一起发送)。在Java应用程序中无法访问IP数据包,因此Sniffy使用一些启发式方法来添加延迟,如下所述:http://sniffy.io/docs/latest/#_emulating_network_issues;将指定的延迟添加到客户端的Socket.connect()方法 – bedrin

+0

这不是要求的。他希望看到他的*现有*客户端如何对连接超时做出反应,并且您所做的任何事情都不会导致连接超时。 – EJP