服务器通过socket获取到请求url(socket包含ip、端口号)。通过反射机制获取类中的方法及参数类型,然后使用url实例化一个类的对象,用该对象执行对应的方法。
客户端,首先获取服务器的ip地址及端口号。然后给服务器传送一个url,要调用的方法名及要传的参数。再通过同一端口获取执行结果。下面是源码:
服务端:
StartUp:
public class StartUp {
public static final int port = 9001;
public static void main(String[] args) {
exportRpc();
}
private static void exportRpc() {
try {
ServerSocket ss = new ServerSocket(port);
System.out.println("server is running....");
while(true){
Socket s = ss.accept() ; //采用TcP协议
if(s!=null){
new RpcThread(s).start();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
RpcThread:
public class RpcThread extends Thread {
private Socket socket;
public RpcThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
ObjectInputStream is = null;
ObjectOutputStream os = null;
try {
//从TcP报文获取数据
is = new ObjectInputStream(socket.getInputStream());
// 得到远程调用参数,包含了接口名,调用方法,方法参数
RpcObject rpcObject = (RpcObject) is.readObject();
System.out.println("Method:"+rpcObject.getMethodName());
// 构建接口的实现类,然后通过反射调用方法
Object o = getObject(rpcObject.getUrl());
System.out.println("class:"+rpcObject.getUrl());
Object reO =