我在两台计算机上运行两个程序(比如A和B),A和B都连接到专用LAN,可以轻松地ping /发送/接收数据。
我在计算机A的程序中有一个方法,我在其中定期发送一个简单的字符串给接收它的B。
我使用在字符串本身设置发送时间
long sent = System.currentTimeMillis()
。
在计算机B中,我有一个线程正在运行以接收字符串并处理它,在收到字符串后,我使用相同的long receive = System.currentTimeMillis()
得到当前时间,然后使用
long delay = receive - sent;
long finalDelay = TimeUnit.MILLISECONDS.convert(delay, TimeUnit.MILLISECONDS);
问题在于,在接收方,我得到了奇怪的值,延迟为负数(大数和小数)。
我尝试在没有long delay = receive - sent;
机制的情况下使用TimeUnit
但仍然获得负值。
我已将A和B同步到时间服务器。两者都运行Windows 7操作系统,Java 1.7_21 jdk和Netbeans IDE 7.4
我尝试使用System.nanoTime()
,但它提供了相同的结果,我认为System.nanoTime()
无法在我的方案中使用send
,而receive
会有不同的开始时间,因为它们都运行在不同的JVM和不同的机器上。
那么我犯的错误是什么?任何帮助将受到高度赞赏。
更新:使用发件人和收件人端代码
发件人
while (true) {
try {
rCon = (RadiogramConnection) Connector.open("radiogram://broadcast:" + HOST_PORT);
dg = rCon.newDatagram(50); // only sending 12 bytes of data
// Get the current time and sensor reading
double tempReading = tempSensor.getCelsius();
long now = VM.getTimeMillis(); // I used System.currentTimeMillis() as well as new Date().gettime() here
// Flash an LED to indicate a sampling event
led.setRGB(255, 0, 0);
led.setOn();
Utils.sleep(50);
led.setOff();
// Package the time and sensor reading into a radio datagram and send it.
dg.reset();
dg.writeLong(now); // I send the time in a datagram
dg.writeInt((int)tempReading);
rCon.send(dg);
rCon.close();
// Go to sleep to conserve battery
Utils.sleep(SAMPLE_PERIOD - (System.currentTimeMillis() - now));
} catch (Exception e) {
System.err.println("Caught " + e + " while collecting/sending sensor sample.");
}
}
接收机
public void run() throws Exception {
RadiogramConnection rCon;
Datagram dg;
try {
rCon = (RadiogramConnection) Connector.open("radiogram://:" + HOST_PORT);
dg = rCon.newDatagram(rCon.getMaximumLength());
} catch (IOException e) {
System.err.println("setUp caught " + e.getMessage());
throw e;
}
// Main data collection loop
while (true) {
try {
// Read sensor sample received over the radio
rCon.receive(dg);
long sendTime = dg.readLong(); // read time of the reading
int val = dg.readInt();
long time = System.currentTimeMillis();
System.out.println("Original Time : "+sendTime +" ms and Receiving Time : "+time+
" ms =:= Temperature value = " + val);
System.out.println("The Total delay is: "+(time-sendTime));
如果我在同一台计算机上运行发送方和接收方,那么我会得到预期的延迟值,但在不同的计算机上却很疯狂。
答案 0 :(得分:2)
在请求主机上测量完整的往返,请求和响应的时间,并将其除以2。这样你就可以随时偏离等式。