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();
}
}
}
该地址,是服务端注册的地址。
运行该程序,结果如下。
服务端工程是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();
}
}
}
该地址,是服务端注册的地址。
运行该程序,结果如下。
相关文章推荐
- java中对list排序问题
- Java GUI编程中AWT/swing/SWT的优缺点
- 排序算法java三--堆排序
- java enum(枚举)使用详解 + 总结
- Java多线程学习
- java list 数组 转换
- Java 时间 转换/Date(1384171247000+0800)/
- 趣谈Java变量的可见性问题
- Java IO流中的flush()
- Struts2中Action接收参数的方法
- 在Java中使用WebSocket实现网页聊天室
- Timer
- java中的Properties类的操作
- JVM运行时数据区域
- Java解析JSON文件的方法
- Myeclipse启动不了的解决方法
- Java设计模式编程中的责任链模式使用示例
- 断言---java
- java swing游戏编程高仿金山打字教程-拯救苹果
- java中超大大数字的计算方法