我正在使用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
}
}
}
我不确定为什么回复的表现方式与我们一样,我希望这是一个简单的事情,我忽略了。