如何模拟本地端口的网络延迟?

时间:2017-07-05 15:08:52

标签: java network-programming

我想看看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,但它似乎在客户端使用(我不认为我&# 39; ll能够覆盖客户端,以便它使用SlowSocket)。

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

  

我想看看HTTP客户端如何响应连接超时,即服务器正在监听端口的位置,但设置连接的过程非常慢,客户端放弃并返回连接超时。

您的要求体现了矛盾。当对等主机根本没有响应时,通常由于防火墙而发生连接超时。它与服务器应用程序缓慢无关。服务器没有“建立连接”:TCP堆栈。

  

不应拒绝连接

除非如下所示,否则不会有听力过程。

  

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

这正是您编写的代码将产生的。

然而当且仅当服务器平台不是Windows时,还有另一种产生连接超时的方法:让积压队列填满。要生成它,让服务器执行所有正常的套接字设置步骤,但根本不调用accept(),并让客户端执行大量的连接尝试。但如果服务器平台是Windows,则会产生连接拒绝。

答案 1 :(得分:-1)

  

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

您可以使用Sniffy来模拟网络延迟 - 它与Java TCP堆栈无缝集成,并且不需要从应用程序端进行任何更改。请参阅documentation on emulating network issues

demo.sniffy.io提供在线演示 - 点击右下角的小部件,转到"网络连接" 标签并设置延迟 en.wikipedia.org 表示1000毫秒。刷新浏览器页面,您将看到加载页面需要1秒钟。 javaagent integration也可用于非Web应用程序。

enter image description here

免责声明:我是Sniffy

的作者