Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用PHP echo服务器测量带宽_Java_Php_Bandwidth - Fatal编程技术网

Java 使用PHP echo服务器测量带宽

Java 使用PHP echo服务器测量带宽,java,php,bandwidth,Java,Php,Bandwidth,我试图使用java获得一些关于带宽和延迟的信息。um所做的一切就是向php服务器发送字节数,php服务器用这些字节的字符串回复。奇怪的是,对于从4字节到4096字节的数据包,响应时间几乎是恒定的,但在较大的数据包大小(大于4KB)下,响应时间线性增加 PS:为了减少测量带宽,我尝试进行流量整形,但同样的问题也发生了 下面是java代码 public void measure() throws IOException { timeArray = new double[sizeArra

我试图使用java获得一些关于带宽和延迟的信息。um所做的一切就是向php服务器发送字节数,php服务器用这些字节的字符串回复。奇怪的是,对于从4字节到4096字节的数据包,响应时间几乎是恒定的,但在较大的数据包大小(大于4KB)下,响应时间线性增加

PS:为了减少测量带宽,我尝试进行流量整形,但同样的问题也发生了

下面是java代码

   public void measure() throws IOException {
    timeArray = new double[sizeArray.length];
    for (int i = 0; i < sizeArray.length; i++) {
    URL url = new URL("http://10.10.10.101/test.php?bytes=" +sizeArray[i]); 

    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    try {
        connection.setDoInput(true);
        connection.setDoOutput(true);
        connection.setUseCaches(false);
        connection.setRequestMethod("POST");

        DataInputStream in = new DataInputStream (connection.getInputStream ());
        long start = System.nanoTime();
        byte [] temp = new byte[sizeArray[i]];
        in.readFully(temp);
       long end = System.nanoTime();
       System.out.println("Size = " + sizeArray[i] + " , time = "+(end - start) +" ");
        in.close();
        //linear.addPoint(k[i] * Math.pow(10, -6) , (end - start) * Math.pow(10, -9));
       // simple.addData(k[i] * Math.pow(10, -6) , (end - start) * Math.pow(10, -9));
        timeArray[i] = (end - start);
    } finally {
        connection.disconnect();
    }
    }
}
public void measure()引发IOException{
timeArray=新的双精度[sizeArray.length];
对于(int i=0;i
下面是php echo服务器的代码

<?php
$bytes = $_GET["bytes"]; 
$temp = intval ($bytes);
$result = str_pad("",$temp,"*");
echo($result);
?>

有人能解释这种奇怪的行为吗

奇怪的是,对于从4字节到4096字节的数据包,响应时间几乎是恒定的,但在较大的数据包大小(大于4KB)下,响应时间线性增加

这可能是由于输出缓冲。如果查看输出缓冲区部分,您可能会看到4096字节是输出的默认缓冲区大小。这基本上意味着,在is累积4096字节的信息发送之前,PHP不会为您的请求提供服务

如果您希望在所有请求中看到线性增加,那么您需要降低此缓冲区。如果你想要更高的一致性,你会提高它。真的,虽然你可能不应该把它弄得太乱。但我想你只是在享受乐趣和尝试语言。我希望这回答了你的问题,为什么会有这种行为

编辑: 在浏览了java源代码以及HttpUrlConnection是如何处理一些代码之后,我想知道添加一个content-length头是否也会对您有所帮助

<?php
$bytes = $_GET["bytes"]; 
$temp = intval ($bytes);
$result = str_pad("",$temp,"*");
header('Content-Length: ' . $temp);
echo($result);
?>


Apache或任何您用来服务请求的东西都应该自动添加它,但是尝试显式地设置头并没有什么坏处。请注意,您是否考虑过您遇到的TTFB(第一个字节的时间)问题可能来自服务器本身的开销,而不是php代码?你是如何处理这些请求的?考虑使用Apache上的配置,或者在服务器上使用相同的任何东西。

这可能是由于浏览器。Chrome因在服务实际请求之前预缓冲4096字节而臭名昭著。当您尝试流式传输内容时,经常会遇到这样的问题:我试图取消此输出缓冲,但也会出现相同的行为。我认为情况并非如此,因为服务器已经在不进行缓冲的情况下回复小数据包。我没有查看PHP源代码,但如果它用来回复的缓冲区首先分配给ini值,我也不会感到惊讶。因此,它在默认情况下是缓冲的。你怎么知道它不是缓冲呢?我想是的,因为php已经对4kB以下的数据包发送了响应。所以它没有缓冲区。我也试图将缓冲区减少到4字节,但发生了相同的行为。你是否完全关闭了缓冲区?我想知道这是否与java的阅读方式有关。您介意用一个我可以尝试的工作示例更新您的java代码吗?