Java RMI 远程方法调用Remote Method Invocation

转载:http://www.cnblogs.com/yangchongxing/p/9078061.html

1、创建远程方法接口(必须继承自java.rmi.Remote接口)

package cn.ycx.date;

import java.rmi.Remote;
import java.rmi.RemoteException; public interface DateRemote extends Remote {
public String now() throws RemoteException;
}

2、创建远程服务实现

远程对象必须实现java.rmi.server.UniCastRemoteObject类,该类的构造函数中将生成stub(存根)和skeleton(骨架), 这样才能保证客户端访问获得远程对象时,该远程对象将会把自身的一个拷贝以Socket的形式传输给客户端,此时客户端所获得的这个拷贝称为Stub(存根),而服务器端本身已存在的远程对象则称之为Skeleton(骨架)。其实此时的存根是客户端的一个代理,用于与服务器端的通信,  而骨架也可认为是服务器端的一个代理,用于接收客户端的请求之后调用远程方法来响应客户端的请求。

package cn.ycx.server;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.text.SimpleDateFormat;
import java.util.Date; import cn.ycx.date.DateRemote; public class DateRemoteImpl extends UnicastRemoteObject implements DateRemote {
private static final long serialVersionUID = -4892445365627614558L;
protected DateRemoteImpl() throws RemoteException {
super();
}
@Override
public String now() throws RemoteException {
SimpleDateFormat format = new SimpleDateFormat("yyy-MM-dd HH:mm:ss");
return format.format(new Date());
}
}

3、启动远程服务

package cn.ycx.server;

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
// java cn.ycx.server.ServerTest
public class ServerTest {
//rmiregistry
public static void main(String[] args) {
try {
Registry registry = LocateRegistry.createRegistry(1099);
registry.bind("dateRemote", new DateRemoteImpl());
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("RMI Server is ready...");
}
}

4、创建客户端实现

package cn.ycx.client;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException; import cn.ycx.date.DateRemote; // java -jar client.jar
public class ClientTest { public static void main(String[] args) {
DateRemote dateRemote;
try {
dateRemote = (DateRemote) Naming.lookup("rmi://192.168.1.190:1099/dateRemote");//
System.out.println(dateRemote.now());
} catch (MalformedURLException e) {
} catch (RemoteException e) {
} catch (NotBoundException e) {
}
}
}

导出为可执行jar

java -jar client.jar

运行结果:2018-05-23 17:26:58

最新文章

  1. javascript中的操作符详解1
  2. 打造android偷懒神器———ListView的万能适配器
  3. Php 笔记
  4. POJ3764 The xor-longest Path
  5. ACM 矩形的个数
  6. codevs 1202 求和
  7. hook_schema 小总结
  8. Qt5 程序发布打包
  9. jQuery选择器之表单对象属性过滤选择器Demo
  10. UWP textbox 只能输入数字
  11. Google Maps 学习笔记(一)2014.06.04
  12. Swift字符串可变性
  13. UVA 1584 字符串
  14. 洛谷 [P2764]最小路径覆盖问题
  15. day2 and day3 总结-python基础-坚持就是胜利
  16. blfs(systemd版本)学习笔记-编译安装配置dhcpcd
  17. mongoDB 安装和配置环境变量,超详细版本
  18. BZOJ4818 [SDOI2017] 序列计数 【矩阵快速幂】
  19. java 重载 : 1.参数个数不同,2.参数类型不同
  20. msf web_delivery模块攻击

热门文章

  1. 关于GC(中):Java垃圾回收相关基础知识
  2. API的描述语言--Swagger
  3. firefox浏览器中使用vux的x-input报错TypeError: _this3.$refs.input.scrollIntoViewIfNeeded is not a function
  4. windows 10 上源码编译OpenCV并支持CUDA | compile opencv with CUDA support on windows 10
  5. echarts对柱状图进行标注,以及取消hover时的阴影
  6. 《手把手教你》系列练习篇之3-python+ selenium自动化测试(详细教程)
  7. Java中的compareTo()方法,compareToIgnoreCase()方法
  8. Unicode和Ascii的区别
  9. 转载 :c# 获取net framework 版本(Environment 类)
  10. TCP/IP头部详解