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

java远程调用

2016-05-07 10:49 696 查看
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();

}

}

}

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

运行该程序,结果如下。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: