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 楼答案
也许这与客户端逐字节读取数据有关,这会迫使流量控制算法限制传输带宽:
尝试将数据读入数组,或者使用
BufferedInputStream
: