java远程调用

来源:互联网 发布:淘宝规则在哪里查看 编辑:程序博客网 时间:2024/06/05 20:57

1 编写服务端

  服务端工程是RmiServer,接口如下,注意两点,一个是一定要继承Remote的父类,另外是远程调用的方法一定要抛出RemoteException的异常。

package cn.server;


import java.rmi.Remote;
import java.rmi.RemoteException;


public interface ITimeServer extends Remote{
public long getServerTime() throws RemoteException  ;
}


服务端的实现类实现ITimeServer接口,并继承UnicastRemoteObject的父类,有两点要注意,一个是要有显示的构造方法并抛出RemoteException 异常,另外一个是远程调用的方法要抛出RemoteException 异常。

package cn.server;


import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;


public class ITimeServerImpl extends UnicastRemoteObject implements ITimeServer {
    
private static final long serialVersionUID = 8221409097017900253L;


protected ITimeServerImpl() throws RemoteException {
super();
 
}


@Override
public long getServerTime() throws RemoteException {
 
return System.currentTimeMillis();
}


}


要生成远程调用的class,进入cmd命令,进入该class的目录下,输入rmic 命令即可


可以看到生成stub的class,这个是远程的class



编写服务启动程序 

package cn.server;


import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;


public class StartServer {


 
public static void main(String[] args) {
try {
//start rmiregistry
ITimeServerImpl timeServer=new ITimeServerImpl();
        Naming.rebind("rmi://localhost:1099/timeServer", timeServer);
System.out.print("Ready");
} catch (Exception e) {
 
e.printStackTrace();
}
 


}


}


启动注册注册表服务,默认是1099端口,如果不启动注册表服务,上面的mian运行会报错。



运行服务端的main方法,该服务运行成功。


如果不想用命令的方式启动注册表服务,需要在main方法加入LocateRegistry.createRegistry(1099);这句话会动态启动注册表服务。



编写客户端RmiClient工程,注意接口一定要和服务端的接口在同一个包下面,同样的接口名

package cn.server;


import java.rmi.Remote;
import java.rmi.RemoteException;


public interface ITimeServer extends Remote{
public long getServerTime() throws RemoteException  ;
}


客户端调用远程服务端的方法

package cn.client;


import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;


import cn.server.ITimeServer;


public class Client {
           public static void main(String[] args) {
 
ITimeServer iTimeServer;
try {
iTimeServer = (ITimeServer) Naming.lookup("rmi://localhost:1099/timeServer");
System.out.println(iTimeServer.getServerTime());
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (RemoteException e) {
 
e.printStackTrace();
} catch (NotBoundException e) {
 
e.printStackTrace();
}
           
}


}


该地址,是服务端注册的地址。

运行该程序,结果如下。


 
























0 0
原创粉丝点击