使用DatagramSocket和DatagramPacket来“ping”一台机器

时间:2015-05-04 10:11:25

标签: java sockets datagram

我正在使用DatagramSocket从服务器获取数据。在这样做的过程中,我希望确定它何时发送和收到之间的延迟,主要是ping。但是,当我运行我的代码时,我测量的延迟似乎不合逻辑。

我有一个ScheduledThreadPoolExecutor,包含4个线程的池。我所看到的是,当我发送一条消息时,我得到一个ping 20ms,很好。但是当我并排发送两条消息时,我得到两个40ms的ping,三个是60ms,四个是80ms。 5当然可以追溯到80分钟,我在80分钟获得4分,在20分钟时获得1分。

这就是我提出请求的方式:

public Future<JSONObject> sendQuery(final String addr, final int port) throws IOException {
    return app.getExecutor().submit(new Callable<JSONObject>() {

        @Override
        public JSONObject call() throws Exception {
            DatagramSocket socket = new DatagramSocket();

            // send request
            byte[] buf = new byte[256];
            InetAddress address = InetAddress.getByName(addr);
            DatagramPacket packet = new DatagramPacket(buf, buf.length, address, port);
            long start = System.currentTimeMillis();
            socket.send(packet);

            // get response
            packet = new DatagramPacket(buf, buf.length);
            socket.receive(packet);
            long end = System.currentTimeMillis();

            // set response
            String jsonStr = new String(packet.getData(), 0, packet.getLength());
            JSONObject jso = new JSONObject(jsonStr);
            jso.put("ping", (int) (end - start));

            return jso;
        }
    });

}

并通过以下方式致电:

for (ServerDefinition server: servers) {
    String addr = server.getAddr();
    int port = server.getPort();
    pending.add(clientApp.getQuerySocket().sendQuery(addr, port));
}

然后从更新循环开始:

private void initializePending() throws InterruptedException, ExecutionException {
    Iterator<Future<JSONObject>> it = pending.iterator();
    while (it.hasNext()) {
        Future<JSONObject> future = it.next();
        if (future.isDone()) {
            it.remove();

            JSONObject resp = future.get();

            // do some stuff
        }
    }
}

我不确定为什么回复的表现方式与我们一样,我希望这是一个简单的事情,我忽略了。

0 个答案:

没有答案