3

我正在尝试构建一个带宽测试工具,有点像 IPerf,但在 java 中,我似乎比预期的丢包更多,但是带宽稍高(开始于大约 30-40Mb/s),我希望有人可能指出一些优化或我做错的事情,这会导致我丢失数据包。

这是接收代码,它将大小为 2000 的队列移交给另一个收集指标的类,它只传递数据包中的相关信息。使用蔚来

while (data.isRunning()) 
{
    if(channel.receive(buf) != null)
    {

    int j = buf.array().length;
    //add the packets important information to the queue
    packet_info.add(new PacketInfoContainer(buf.getLong(j-12), System.nanoTime(), buf.getInt(j-4)));

    // if we have 2000 packets worth of information, time to handle it!
    if((packet_info.size() == 2000))
    {
        Runnable r1;
        //if this is running on the client side, do it this way so that we can calculate progress
        if(client_side)
        {
            if(data_con.isUserRequestStop())
            {
                System.out.println("suposed to quit");
                data.stopTest();
                break;
            }
            if(packets_expected > 0)
            {
                total_packets_received+=1000;
                setChanged();
                notifyObservers("update_progress" + Integer.toString( (int) (((double)total_packets_received/(double)packets_expected) * 1000) ) );
            }
            r1 = new PacketHandler(packet_info, results, buffer_size, client);
        }
        //server side, no nonsense
        else
        {
            r1 = new PacketHandler(packet_info, results, buffer_size);
        }
        pool.submit(r1);
        packet_info = new LinkedList<PacketInfoContainer>();
    }

}
buf.clear();

}

4

2 回答 2

1

UDP 不是很好...也许您可以使用 TCP 并检查 SO 的 tcp 统计信息以查看重传...

网络统计 -s

您可以使用CharacterGenerator,将 BufferedOutputStream 更改为 64KB 并删除 os.flush(); 加速和测试...

于 2013-01-05T22:06:54.713 回答
1

它不允许我发表评论,我走了。

在达到线路限制之前,您不应该看到丢弃的数据包。我建议在花大量时间查看代码之前隔离丢包的问题并使用工具来确定您是否有硬件/环境问题。

于 2016-08-07T11:36:09.753 回答