通过RMI 获取精确时间
发布网友
发布时间:2022-04-24 19:56
我来回答
共2个回答
热心网友
时间:2023-10-09 05:46
直接上代码 比着写一遍就懂了
接口:
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.Date;
public interface Clock extends Remote {
public Date getTime() throws RemoteException ;
}
实现:
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.Date;
import Clock;
public class ClockImpl extends UnicastRemoteObject implements Clock {
public ClockImpl() throws RemoteException {
super();
}
public Date getTime() throws RemoteException {
return new Date();
}
}
服务器:
import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import Clock;
import ClockImpl;
public class Server {
public static void main(String[] args) {
try {
Clock c = new ClockImpl();
LocateRegistry.createRegistry(6543);
Naming.bind("rmi://localhost:6543/timeService", c);
} catch (RemoteException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (AlreadyBoundException e) {
e.printStackTrace();
}
}
}
客户端:
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import Clock;
public class Client {
public static void main(String[] args) {
try {
Clock c = (Clock) Naming.lookup("rmi://localhost:6543/timeService");
System.out.println(c.getTime());
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
} catch (NotBoundException e) {
e.printStackTrace();
}
}
}
先启动服务器,再启动客户端调用,客户端输出通过RMI从服务器调用得到的时间
热心网友
时间:2023-10-09 05:46
RMI:是指 java 远程调用吗? 如果是这个没什么好说的,百度下找个例子就懂。
ntp:前后发布了几个协议,具体的就没有深究
参考:http://wenku.baidu.com/view/0bb3547702768e9951e738c7.html
个人认为大概可以这么做吧:
1. 客户端 发送一个请求 给服务端,里面包含了客户端发送该请求的 时间(客户端的时间)(T1)
2. 服务端 接收到请求,记录下服务端接收到请求的时间(服务端的时间)(T2)
3. 服务端回发一个请求 给客户端,里面包含了服务端发送该请求的 时间(服务端的时间)(T3)
2. 客户端 接收到请求,记录下接收到请求的时间(客户端的时间)(T4)
所以来回的网络延时 = ( T4 - T3 ) + ( T2 - T1 )
所以收到 T4时, 服务器 的时间 = T3 + 网络延时/2
举个例子吧:(客户端和服务端相差10)
客户端 服务端
(T1) 100 ---------| 110
101 | 111
102 |--------- 112(T2)
103 113
104 114
105 |--------- 115(T3)
106 | 116
(T4)107 ---------| 117
(T2 和T3间的差距取决于服务器的压力,但不影响计算时间)
所以来回的网络延时 = ( T4 - T3 ) + ( T2 - T1 ) = (107-115) + (112-100) = 4
所以收到 T4时, 服务器 的时间 = T3 + 网络延时/2 = 115 + 4/2 = 117追问感谢大神回复,个人的疑惑是,要求是RMI ,网上搜索了相关的简单实例,都是Client端使用naming.lookup来得到Server端相应的Object,而我不知道如何从客户端发送数据到服务器端,找了好久也没对应的方法,我属于超级小白,是不是还要使用udp,Socket什么的,发送数据,这也属于RMI的一部分吗?问题比较弱,望见谅
追答client 端拿到的 只是server 端的实现类的一个代理,其实你完全可以不管他的实现,拿到虚拟对象,直接调用你写的接口的方法就行了,上面有人已经给出详细例子了,你看下吧。