RMI远程方法调用,服务器端客户端得用Java。
在服务器端建一个远程接口并写个实现类,最后写个主类发布出去。
接口类:
package com.gg.rmi.Interface;
import java.rmi.Remote;
import java.rmi.RemoteException;
//定义一个远程接口,必须继承Remote接口,其中需要远程调用的方法必须抛出RemoteException异常
public interface Hello extends Remote {
/**
* 简单的返回“Hello World!"字样
* @return 返回“Hello World!"字样
* @throws java.rmi.RemoteException
*/
public String helloWorld()throws RemoteException;
/**
* 一个简单的业务方法,根据传入的人名返回相应的问候语
* @param someBodyName 人名
* @return 返回相应的问候语
* @throws java.rmi.RemoteException
*/
public String sayHelloToSomeBody(String someBodyName) throws RemoteException;
}
实现类:
package com.gg.rmi.server;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import com.gg.rmi.Interface.Hello;
public class HelloImpl extends UnicastRemoteObject implements Hello {
protected HelloImpl() throws RemoteException {
super();
System.out.println("HelloIml初始化。。。");
}
@Override
public String helloWorld() throws RemoteException {
System.out.println("调用HelloWorld方法");
return "Hello world";
}
@Override
public String sayHelloToSomeBody(String someBodyName)
throws RemoteException {
System.out.println("调用sayHelloWorldToSomeBody方法");
return "你好," + someBodyName + "!";
}
}
主类;
package com.gg.rmi.server;
import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import com.gg.rmi.Interface.Hello;
public class HelloServer {
public static void main(String args[]) {
try {
//创建一个远程对象
Hello rhello = new HelloImpl();
//本地主机上的远程对象注册表Registry的实例,并指定端口为8888,这一步必不可少(Java默认端口是1099),必不可缺的一步,缺少注册表创建,则无法绑定对象到远程注册表上
LocateRegistry.createRegistry(8888);
//把远程对象注册到RMI注册服务器上,并命名为RHello
//绑定的URL标准格式为:rmi://host:port/name(其中协议名可以省略,下面两种写法都是正确的)
Naming.bind("rmi://localhost:8888/RHello",rhello);
// Naming.bind("//localhost:8888/RHello",rhello);
System.out.println(">>>>>INFO:远程IHello对象绑定成功!");
} catch (RemoteException e) {
System.out.println("创建远程对象发生异常!");
e.printStackTrace();
} catch (AlreadyBoundException e) {
System.out.println("发生重复绑定对象异常!");
e.printStackTrace();
} catch (MalformedURLException e) {
System.out.println("发生URL畸形异常!");
e.printStackTrace();
}
}
}
在客户端上:
package com.gg.rmi.client;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import com.gg.rmi.Interface.Hello;
public class HelloClient {
public static void main(String args[]){
try {
//在RMI服务注册表中查找名称为RHello的对象,并调用其上的方法
Hello rhello =(Hello) Naming.lookup("rmi://localhost:8080/RHello"); //填主机的ip
System.out.println(rhello.helloWorld());
System.out.println(rhello.sayHelloToSomeBody("red-dragon"));
} catch (NotBoundException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
遇到的问题:
解决方法:把接口类的包名内容一摸一样的放到客户端上.