有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java中的socketTCP传输非常慢

在我的网络实验室里,我正在做一个程序来饱和一个链路以进行性能测试,我尝试了不同的事情,从更改发送和接收缓冲区,创建一个文件并读取它,创建一个长数组并通过socket一次发送它:OutputStream。写入(字节[])

数组的长度为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);
}

在本例中,我提出了我的最后一个想法,即创建一个包含一百万个字节数组的文件,然后读取该文件并写入socket,然后再发送字节数组

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

有什么想法吗???我现在觉得有点失落

谢谢


共 (1) 个答案

  1. # 1 楼答案

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

    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;
            }
        }
    }