远程调用接口
package demo;
import java.rmi.Remote;
import java.rmi.RemoteException;
/**
* 服务器调用“远程调用接口”
*/
public interface IHello extends Remote {
/**
*
* @param task 必须序列化(因为要进行网络传输)
* @return
* @throws RemoteException
*/
String say(String msg,HelloTask task) throws RemoteException;
}
远程调用接口的参数
package demo;
/**
* 远程调用接口的参数接口
*/
public interface HelloTask{
String execute();
}
远程调用接口的参数实现类
package demo.client;
import demo.HelloTask;
import java.io.Serializable;
public class HelloTaskImpl implements HelloTask, Serializable {
private static final long serialVersionUID = -5448096327299735692L;
@Override
public String execute() {
return "Hello world!";
}
}
客户端
package demo.client;
import demo.HelloTask;
import demo.IHello;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.util.Scanner;
public class HelloClient {
public static void main(String[] args) {
try {
IHello hi=(IHello) Naming.lookup("rmi://127.0.0.1:8888/hello");
HelloTask helloTask=new HelloTaskImpl();
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
scanner.nextLine();
for (int i = 0; i <n ; i++) {
System.out.println(hi.say(scanner.nextLine(),helloTask));
}
scanner.close();
} catch (NotBoundException | MalformedURLException | RemoteException e) {
e.printStackTrace();
}
}
}
远程调用接口的实现
package demo.server;
import demo.HelloTask;
import demo.IHello;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
/**
*
* 必须继承UnicastRemoteObject,以允许JVM创建远程的存根/代理。
*/
public class RemoteHello extends UnicastRemoteObject implements IHello {
private static final long serialVersionUID = -3176847812287329375L;
protected RemoteHello() throws RemoteException {
super();
}
@Override
public String say(String msg,HelloTask task) throws RemoteException {
String result=task.execute();
System.out.println("client say:"+msg+",execute "+result);
return result;
}
}
RMI服务器端
package demo.server;
import java.rmi.AlreadyBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class RMIServer {
public static void main(String[] args) {
try {
RemoteHello hello = new RemoteHello();
//监听8888端口
Registry registry = LocateRegistry.createRegistry(8888);
//绑定远程接口
registry.bind("hello", hello);
System.out.println("start...");
} catch (RemoteException | AlreadyBoundException e) {
e.printStackTrace();
}
}
}