这篇博客基本照搬了分布式java应用基础与实践一书的内容

java自带的远程调用分两种一种是rmi,一种是webservice

我们先看rmi(remote method invoke)#

使用rmi

看代码

  1. /**
  2. * 《构建高性能的大型分布式Java应用》
  3. * 书中的示例代码
  4. * 版权所有 2008---2009
  5. */
  6. package book.chapter1.rmi;
  7.  
  8. import java.rmi.Remote;
  9. import java.rmi.RemoteException;
  10.  
  11. /**
  12. * 描述:服务器端的业务功能类
  13. *
  14. * @author bluedavy
  15. * 创建时间: 2009-1-4
  16. */
  17.  
  18. public interface Business extends Remote{
  19.  
  20. /**
  21. * 显示客户端提供的信息,并返回
  22. */
  23. public String echo(String message) throws RemoteException;
  24. public int add(int a,int b) throws RemoteException;
  25. }
  26.  
  27. /**
  28. * 《构建高性能的大型分布式Java应用》
  29. * 书中的示例代码
  30. * 版权所有 2008---2009
  31. */
  32. package book.chapter1.rmi.impl;
  33.  
  34. import java.rmi.RemoteException;
  35.  
  36. import javax.jws.WebService;
  37.  
  38. import book.chapter1.rmi.Business;
  39.  
  40. /**
  41. * 描述:
  42. *
  43. * @author bluedavy
  44. * 创建时间: 2009-1-4
  45. */
  46. @WebService
  47. public class BusinessImpl implements Business {
  48.  
  49. /* (non-Javadoc)
  50. * @see book.chapter1.rmi.Business#echo(java.lang.String)
  51. */
  52. public String echo(String message) throws RemoteException {
  53. if("quit".equalsIgnoreCase(message.toString())){
  54. System.out.println("Server will be shutdown!");
  55. System.exit(0);
  56. }
  57. System.out.println("Message from client: "+message);
  58. return "Server response:"+message;
  59. }
  60.  
  61. @Override
  62. public int add(int a, int b) throws RemoteException {
  63. System.out.println("a+b");
  64. return a+b;
  65. }
  66.  
  67. }
  68. package book.chapter1.rmi;
  69. /**
  70. * 《构建高性能的大型分布式Java应用》
  71. * 书中的示例代码
  72. * 版权所有 2008---2009
  73. */
  74. import java.rmi.registry.LocateRegistry;
  75. import java.rmi.registry.Registry;
  76. import java.rmi.server.UnicastRemoteObject;
  77.  
  78. import javax.xml.ws.Endpoint;
  79.  
  80. import book.chapter1.rmi.impl.BusinessImpl;
  81.  
  82. /**
  83. * 描述:基于RMI实现的服务器端
  84. *
  85. * @author bluedavy
  86. * 创建时间: 2009-1-4
  87. */
  88. public class Server {
  89.  
  90. /**
  91. * @param args
  92. */
  93. public static void main(String[] args) throws Exception{
  94. String name="BusinessDemo";
  95. Business business=new BusinessImpl();
  96. //UnicastRemoteObject.exportObject的第二个参数我也不知道有什么用
  97. UnicastRemoteObject.exportObject(business, 0);
  98. Registry registry=LocateRegistry.createRegistry(1099);
  99. registry.rebind(name, business);
  100. }
  101.  
  102. }
  103.  
  104. package book.chapter1.rmi;
  105. /**
  106. * 《构建高性能的大型分布式Java应用》
  107. * 书中的示例代码
  108. * 版权所有 2008---2009
  109. */
  110. import java.rmi.registry.LocateRegistry;
  111. import java.rmi.registry.Registry;
  112.  
  113. /**
  114. * 描述:基于RMI实现的客户端
  115. *
  116. * @author bluedavy
  117. * 创建时间: 2009-1-4
  118. */
  119. public class Client {
  120.  
  121. /**
  122. * @param args
  123. */
  124. public static void main(String[] args) throws Exception{
  125. //下面我没有写端口 那就默认是1099
  126. Registry registry=LocateRegistry.getRegistry("10.150.0.80");
  127. String name="BusinessDemo";
  128. Business business=(Business) registry.lookup(name);
  129. System.out.println(business.add(5, 4));
  130. }
  131. }

我在两台机子上运行,在我自己机子上运行server端,在朋友电脑上运行的是client端,他那边有Clinet.java与Business.java#运行时报ClassNotFoundException#

把BusinessImpl也给他发过去后,就一切ok了#

他那么直接打印出一个9,我这边打印出a+b#





可见计算的过程确实是在我这边的#

使用webservice

  1. /**
  2. * 《构建高性能的大型分布式Java应用》
  3. * 书中的示例代码
  4. * 版权所有 2008---2009
  5. */
  6. package book.chapter1.webservice.impl;
  7.  
  8. /**
  9. * 描述:服务端对外暴露的接口
  10. *
  11. * @author bluedavy
  12. * 创建时间: 2009-2-11
  13. */
  14. public interface Business {
  15.  
  16. /**
  17. * 显示客户端提供的信息,并返回
  18. */
  19. public String echo(String message);
  20.  
  21. }
  22.  
  23. /**
  24. * 《构建高性能的大型分布式Java应用》
  25. * 书中的示例代码
  26. * 版权所有 2008---2009
  27. */
  28. package book.chapter1.webservice.impl;
  29.  
  30. import javax.jws.WebService;
  31. import javax.jws.soap.SOAPBinding;
  32.  
  33. /**
  34. * 描述:以webservice方式对外暴露的服务
  35. *
  36. * @author bluedavy
  37. * 创建时间: 2009-2-11
  38. */
  39. @WebService(name="Business",serviceName="BusinessService",targetNamespace="http://webservice.chapter1.book/client")
  40. @SOAPBinding(style=SOAPBinding.Style.RPC)
  41. public class BusinessImpl implements Business {
  42.  
  43. /* (non-Javadoc)
  44. * @see book.chapter1.webservice.Business#echo(java.lang.String)
  45. */
  46. public String echo(String message) {
  47. if("quit".equalsIgnoreCase(message.toString())){
  48. System.out.println("Server will be shutdown!");
  49. System.exit(0);
  50. }
  51. System.out.println("Message from client: "+message);
  52. return "Server response:"+message;
  53. }
  54.  
  55. }
  56. /**
  57. * 《构建高性能的大型分布式Java应用》
  58. * 书中的示例代码
  59. * 版权所有 2008---2009
  60. */
  61. package book.chapter1.webservice;
  62.  
  63. import javax.xml.ws.Endpoint;
  64.  
  65. import book.chapter1.webservice.impl.BusinessImpl;
  66.  
  67. /**
  68. * 描述:基于Java Webservice实现的服务器端
  69. *
  70. * @author bluedavy
  71. * 创建时间: 2009-2-11
  72. */
  73. public class Server {
  74.  
  75. /**
  76. * @param args
  77. */
  78. public static void main(String[] args) {
  79. Endpoint.publish("http://localhost:9527/BusinessService", new BusinessImpl());
  80. System.out.println("Server has beed started");
  81. }
  82.  
  83. }

有了上面三个类之后,我们可以通过jdk bin目录下的wsimport命令来生成辅助调用代码,如下:

之后,我们发现jdk的工具给我们在book\chapter1\webservice\client下产生了两个类,Business.java,BusinessService.java#

这个两个类,我们其实可以不用看里面的细节(当然你要想看,那就看吧)

看看我们的client端

  1. package book.chapter1.webservice;
  2. /**
  3. * 《构建高性能的大型分布式Java应用》
  4. * 书中的示例代码
  5. * 版权所有 2008---2009
  6. */
  7. import java.io.BufferedReader;
  8. import java.io.InputStreamReader;
  9.  
  10. import book.chapter1.webservice.client.Business;
  11. import book.chapter1.webservice.client.BusinessService;
  12.  
  13. /**
  14. * 描述:基于Webservice实现的客户端
  15. *
  16. * @author bluedavy
  17. * 创建时间: 2009-1-4
  18. */
  19. public class Client {
  20.  
  21. /**
  22. * @param args
  23. */
  24. public static void main(String[] args) throws Exception{
  25. BusinessService businessService=new BusinessService();
  26. Business business=businessService.getBusinessPort();
  27. BufferedReader systemIn=new BufferedReader(new InputStreamReader(System.in));
  28. while(true){
  29. String command=systemIn.readLine();
  30. if(command==null || "quit".equalsIgnoreCase(command.trim())){
  31. System.out.println("Client quit!");
  32. try{
  33. business.echo(command);
  34. }
  35. catch(Exception e){
  36. // IGNORE
  37. }
  38. System.exit(0);
  39. }
  40. System.out.println(business.echo(command));
  41. }
  42. }
  43.  
  44. }

另外如果把代码改成下面的样子

@WebService(name="Business12",serviceName="BusinessService12",targetNamespace="http://c.b.a/d")

@SOAPBinding(style=SOAPBinding.Style.RPC)

public class BusinessImpl implements Business {









生成的java类就是Business12与BusinessService12位于a.b.c.d包下

参考资料

分布式java应用基础与实践

说实话 下面这个关于rmi的分析 我没有看懂

http://guojuanjun.blog.51cto.com/277646/1423392/

基于java自身技术实现消息方式的系统间通信的更多相关文章

  1. 分布式架构从零开始========》【基于Java自身技术实现消息方式的系统间通信】

    基于Java自身包实现消息方式的系统间通信的方式有:TCP/IP+BIO,TCP/IP+NIO,UDP/IP+BIO,UDP/IP+NIO.下面就这4种类型一一做个详细的介绍: 一.TCP/IP+BI ...

  2. 基于JAVA WEB技术旅游服务网站系统设计与实现网上程序代写

    基于JAVA WEB技术旅游服务网站系统设计与实现网上程序代写 专业程序代写服务(QQ:928900200) 随着社会的进步.服务行业的服务水平不断发展与提高,宾馆.酒店.旅游等服务行业的信息量和工作 ...

  3. WebService与RMI(远程调用方式实现系统间通信)

    前言 本文是<分布式java应用基础与实践>读书笔记:另外参考了此博客,感觉讲的挺好的,尤其是其中如下内容: 另外,消息方式实现系统间通信本文不涉及.RMI则只采用spring RMI框架 ...

  4. 基于java开发的在线题库系统tamguo

    简介 探果网(简称tamguo)是基于java开发的在线题库系统,包括 在线访问 后台运营 会员中心 书籍中心 管理员账号:system 密码:123456 因为线上数据和测试数据没有做到隔离,作者已 ...

  5. 系统间通信(5)——IO通信模型和JAVA实践 下篇

    7.异步IO 上面两篇文章中,我们分别讲解了阻塞式同步IO.非阻塞式同步IO.多路复用IO 这三种IO模型,以及JAVA对于这三种IO模型的支持.重点说明了IO模型是由操作系统提供支持,且这三种IO模 ...

  6. 系统间通信(3)——IO通信模型和JAVA实践 上篇

    来源:http://blog.csdn.net/yinwenjie 1.全文提要 系统间通信本来是一个很大的概念,我们首先重通信模型开始讲解.在理解了四种通信模型的工作特点和区别后,对于我们后文介绍搭 ...

  7. 系统间通信(10)——RPC的基本概念

    1.概述 经过了详细的信息格式.网络IO模型的讲解,并且通过JAVA RMI的讲解进行了预热.从这篇文章开始我们将进入这个系列博文的另一个重点知识体系的讲解:RPC.在后续的几篇文章中,我们首先讲解R ...

  8. 系统间通信(9)——通信管理与RMI 下篇

    接上文<架构设计:系统间通信(8)--通信管理与RMI 上篇>.之前说过,JDK中的RMI框架在JDK1.1.JDK1.2.JDK1.5.JDK1.6+几个版本中做了较大的调整.以下我们讨 ...

  9. 系统间通信(8)——通信管理与RMI 上篇

    1.概述 在概述了数据描述格式的基本知识.IO通信模型的基本知识后.我们终于可以进入这个系列博文的重点:系统间通信管理.在这个章节我将通过对RMI的详细介绍,引出一个重要的系统间通信的管理规范RPC, ...

随机推荐

  1. ftp:connect:未知错误号

    Linux下使用ftp命令时,提示:ftp: connect :未知错误号解决方法:service iptables stop或/etc/rc.d/init.d/iptables stop

  2. 关于Allele(等位基因)的理解

    高中学生物的时候关于遗传学的部分,记得当时的教材上为了简化处理一般将基因型定义为AA, Aa, aa.其实这种抽象的理解对应付高考是很有用的,但是实际应用中如果还这样理解那么便会产生一些疑问.之所以会 ...

  3. ACM 继续畅通工程

    Problem Description 省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).现得到城镇道路统计 ...

  4. Python3 输入和输出

    输出格式美化 Python两种输出值的方式: 表达式语句和 print() 函数.(第三种方式是使用文件对象的 write() 方法; 标准输出文件可以用 sys.stdout 引用.) 如果你希望输 ...

  5. Sublime Text 3下C/C++开发环境搭建

    Sublime Text 3下C/C++开发环境搭建 之前在Linux Mint 17一周使用体验中简单介绍过Sublime Text. 1.Sublime Text 3安装 Ubuntu.Linux ...

  6. 【SSH系列】一步步深入springmvc+商品列表查询demo

    在前面的博文中,小编主要简单的介绍springmvc的体系结构.mvc模式的优缺点以及mvc框架,今天我们来继续学习springmvc的相关知识,在这篇博文中,小编讲解过springmvc的体系结构, ...

  7. Hadoop 伪分布式安装、运行测试例子

    1. 配置linux系统环境 centos 6.4 下载地址:http://pan.baidu.com/s/1geoSWuv[VMWare专用CentOS.rar](安装打包好的VM压缩包) 并配置虚 ...

  8. Android基于JsBridge封装的高效带加载进度的WebView

    Tamic http://blog.csdn.net/sk719887916/article/details/52402470 概述 从去年4月项目就一直用起了JsBridge,前面也针对jsBrid ...

  9. Appium webdriver的capabilities配置

    Capabilities是由客户端发送给Appium服务器端的用来告诉服务器去启动哪种我们想要的会话的一套键值对集合.当中也有一些键值对是用来在自动化的过程中修改服务器端的行为方式. 必填的项目: d ...

  10. [Ubuntu] 14.04 关闭桌面

    一直在用Ubuntu的桌面来做调试环境,最近发现桌面会有崩溃的时候,占用资源也比较大,所以想把桌面关闭,只用command界面. 我的系统是Ubuntu14.04 Ctrl+Alt+F1 可以转到命令 ...