您的位置:首页 > 编程语言 > Java开发

Java RMI远程方法调用

2009-11-19 23:02 253 查看
一直想弄懂java远程方法调用,却始终没有写代码实现。一天终于看了Sun公司关于rmi的文章及示例,终于明白了远程方法调用该怎么写。以下是全部代码。

1.暴露给客户端的服务接口

package rmi;
import java.rmi.Remote;
import java.rmi.RemoteException;
/**
* 暴露的接口
* */
public interface IHelloWorld extends Remote{
String sayHello(String from)throws RemoteException;
}


其实这个接口就一个方法,她继承了远程Remote这个借口,要为远程调用必须实现这个接口。

2.IHelloWorld的实现类Helloworld,是接口的一个实现

package rmi;
import java.rmi.RemoteException;
import java.util.logging.Logger;
import javax.rmi.PortableRemoteObject;
/**
* 远程方法对象
* */
public class HelloWorld extends PortableRemoteObject implements IHelloWorld {
Logger log = Logger.getLogger(HelloWorld.class.getName());
protected HelloWorld() throws RemoteException {
super();
}

@Override
public String sayHello(String from) throws RemoteException{
String info = "Say hello from " + from;
log.info(info);
return info;
}
}


该类的实现就是简单的采用日志的形式输出调用信息。

3.服务器端代码HelloWorldServer

package rmi;
import java.rmi.RemoteException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
/**
* RMI服务器
* */
public class HelloWorldServer {

public static void main(String[] args) throws RemoteException, NamingException{
System.out.println("Starting HelloWorldServer...");
//步骤一:实例化服务对象
IHelloWorld helloworld = new HelloWorld();

//步骤二:使用jndi发布服务
Context nameContext = new InitialContext();

nameContext.rebind("HelloWorldService", helloworld);

System.out.println("Started and ready...");
}

}


4.客户端代码HelloWorldClient

package rmi;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;
/**
*RMI 远程方法调用客户端
* */
public class HelloWorldClient {
/**
* @param args
*/
public static void main(String[] args) {
Context ic;
IHelloWorld helloworld;
Object ref;
try{
ic = new InitialContext();
//查找服务
ref = ic.lookup("HelloWorldService");
//narrow服务对象
helloworld = (IHelloWorld)PortableRemoteObject.narrow(ref, IHelloWorld.class);
String info = helloworld.sayHello("Client");
System.out.println("Info:"+info);
}catch(Exception ex){
ex.printStackTrace();
}
}
}


5.最后rmic rmi.HelloWorld生成Stub和Skeleton,

启动服务器:java -classpath . -Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory -Djava.naming.provider.url=iiop://localhost:1050 rmi.HelloWorldServer

启动客户端:java -classpath . -Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory -Djava.naming.provider.url=iiop://localhost:1050 rmi.HelloWorldClient
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: