我正在做一个程序,在我的网络实验室中使性能测试的链接饱和,我尝试了不同的东西,从更改发送和接收缓冲区,创建文件并读取它,创建一个长数组并通过套接字发送它立即: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密集型的。
任何想法???我现在觉得有点失落......
感谢!!!
答案 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;
}
}
}