我刚刚以简单的客户端 - 服务器方式进行了两个线程的通信。这是发件人的代码:
//Open and configure the socket
SocketChannel channel = SocketChannel.open();
InetSocketAddress address = new InetSocketAddress("localhost", 5050);
channel.connect(address);
channel.socket().setTcpNoDelay(true);
channel.socket().setKeepAlive(false);
int count = 0;
OutputStream os = channel.socket().getOutputStream();
int amount = 50;
//Prepare a simple buffer to send.
byte[] data = new byte[amount];
Arrays.fill(data, (byte)1);
double start = System.currentTimeMillis(); //Time it.
//Send and print the throughput each 50000 tuples.
while(true){
count++;
IOUtils.write(data, os);
if(count % 50000==0){
double totalsize = count;
double end = System.currentTimeMillis();
double time = (end-start)/1000;
System.out.println("Writer:"+(totalsize/time)/1000000+"Tuples/second");
}
}
对于接收者:
.....//Just accepting the channel.
//After accepting the channel. Read the tuples.
readC.socket().setTcpNoDelay(true);
readC.socket().setKeepAlive(false);
byte[] readbuf = new byte[50];
InputStream is = readC.socket().getInputStream();
double start = System.currentTimeMillis();
while(true){
IOUtils.read(is, readbuf);
}
输出表明每秒的平均元组仅为0.1 x 10 ^ 6,这意味着每个元组= 50字节,我只能获得5MB / s的吞吐量。
这两个线程都在本地计算机上运行,因此我认为理想的吞吐量远远大于我得到的。
我还检查了wireshark的原因,并发现,当我发送一个元组时,让我们说,从端口71581到端口5050.然后会发送一堆tcp数据包,大约300个数据包! !!!!并且,在这300个数据包中,只有1个数据包真正在71581到5050之间发送数据。
对于其他299个数据包,一个奇怪的事情是通信在端口71581和71580(邻居端口)之间。任何机构都可以解释为什么它做了这么愚蠢的事情?我可以禁用吗?
任何建议,评论和想法都会非常感激!!!!!!!!!!!谢谢!