Java中的TCP传输非常慢

时间:2011-03-07 18:07:36

标签: java sockets tcp

我正在做一个程序,在我的网络实验室中使性能测试的链接饱和,我尝试了不同的东西,从更改发送和接收缓冲区,创建文件并读取它,创建一个长数组并通过套接字发送它立即:OutputStream.write(byte [])

阵列是1000000位置长度,当我嗅探网络流量时,根据嗅探器,数据包有“数据(1460字节)”,这让我觉得我不是逐字节发送的。

使用的带宽约为100Mbps的8%。

我发布相关代码,因为客户端和服务器之间存在一些我认为不相关的交互:

客户端:

int car=0;
do {
    car=is.read();
    //System.out.println(car);
    contador++;
} while(car!=104);

Server:

byte dades[]=new byte[1000000];
FileInputStream fis=null;
try {
    FileOutputStream fos = new FileOutputStream("1MB.txt");
    fos.write(dades);
    fos=null;
    File f = new File("1MB.txt");
    fis = new FileInputStream(f);
    step=0;
    correcte=true;
    sck = srvSock.accept();
    sck.setSendBufferSize(65535);
    sck.setReceiveBufferSize(65535);
    os = sck.getOutputStream();
    is = sck.getInputStream();
}

...

BufferedInputStream bis = new BufferedInputStream(fis);
bis.read(dades);
for(int i=0;i<100;i++) {
    os.write(dades);
}

在这种情况下,我提出了我的最后一个想法,创建一个具有百万位置字节数组的文件,然后读取此文件并写入套接字,在此之前我发送字节数组。

让我相信这不是逐字节发送的另一件事是,在四核计算机中,客户端使用25%的CPU并使用大约8%的带宽,而在旧的单核计算机中(AMD) Athlon)它使用100%的CPU和4%的带宽。服务器不是CPU密集型的。

任何想法???我现在觉得有点失落......

感谢!!!

1 个答案:

答案 0 :(得分:2)

也许这与客户端逐字节读取数据的事实有关,这可能迫使流量控制算法限制传输带宽:

int car=0;
do {
    car=is.read();
    //System.out.println(car);
    contador++;
} while(car!=104);

尝试将数据读入数组,或使用BufferedInputStream

byte[] buf = new byte[65536];
int size = 0;
boolean stop = false;

while (!stop && (size = is.read(buf)) != -1) {
    for (int i = 0; i < size; i++) {
        if (buf[i] == 104) {
            stop = true;
            break;
        }
    }
}