基于java自身技术实现消息方式的系统间通信
这篇博客基本照搬了分布式java应用基础与实践一书的内容
java自带的远程调用分两种一种是rmi,一种是webservice
我们先看rmi(remote method invoke)#
使用rmi
看代码
/** * 《构建高性能的大型分布式Java应用》 * 书中的示例代码 * 版权所有 2008---2009 */ package book.chapter1.rmi; import java.rmi.Remote; import java.rmi.RemoteException; /** * 描述:服务器端的业务功能类 * * @author bluedavy * 创建时间: 2009-1-4 */ public interface Business extends Remote{ /** * 显示客户端提供的信息,并返回 */ public String echo(String message) throws RemoteException; public int add(int a,int b) throws RemoteException; } /** * 《构建高性能的大型分布式Java应用》 * 书中的示例代码 * 版权所有 2008---2009 */ package book.chapter1.rmi.impl; import java.rmi.RemoteException; import javax.jws.WebService; import book.chapter1.rmi.Business; /** * 描述: * * @author bluedavy * 创建时间: 2009-1-4 */ @WebService public class BusinessImpl implements Business { /* (non-Javadoc) * @see book.chapter1.rmi.Business#echo(java.lang.String) */ public String echo(String message) throws RemoteException { if("quit".equalsIgnoreCase(message.toString())){ System.out.println("Server will be shutdown!"); System.exit(0); } System.out.println("Message from client: "+message); return "Server response:"+message; } @Override public int add(int a, int b) throws RemoteException { System.out.println("a+b"); return a+b; } } package book.chapter1.rmi; /** * 《构建高性能的大型分布式Java应用》 * 书中的示例代码 * 版权所有 2008---2009 */ import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; import java.rmi.server.UnicastRemoteObject; import javax.xml.ws.Endpoint; import book.chapter1.rmi.impl.BusinessImpl; /** * 描述:基于RMI实现的服务器端 * * @author bluedavy * 创建时间: 2009-1-4 */ public class Server { /** * @param args */ public static void main(String[] args) throws Exception{ String name="BusinessDemo"; Business business=new BusinessImpl(); //UnicastRemoteObject.exportObject的第二个参数我也不知道有什么用 UnicastRemoteObject.exportObject(business, 0); Registry registry=LocateRegistry.createRegistry(1099); registry.rebind(name, business); } } package book.chapter1.rmi; /** * 《构建高性能的大型分布式Java应用》 * 书中的示例代码 * 版权所有 2008---2009 */ import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; /** * 描述:基于RMI实现的客户端 * * @author bluedavy * 创建时间: 2009-1-4 */ public class Client { /** * @param args */ public static void main(String[] args) throws Exception{ //下面我没有写端口 那就默认是1099 Registry registry=LocateRegistry.getRegistry("10.150.0.80"); String name="BusinessDemo"; Business business=(Business) registry.lookup(name); System.out.println(business.add(5, 4)); } }
我在两台机子上运行,在我自己机子上运行server端,在朋友电脑上运行的是client端,他那边有Clinet.java与Business.java#运行时报ClassNotFoundException#
把BusinessImpl也给他发过去后,就一切ok了#
他那么直接打印出一个9,我这边打印出a+b#
可见计算的过程确实是在我这边的#
使用webservice
/** * 《构建高性能的大型分布式Java应用》 * 书中的示例代码 * 版权所有 2008---2009 */ package book.chapter1.webservice.impl; /** * 描述:服务端对外暴露的接口 * * @author bluedavy * 创建时间: 2009-2-11 */ public interface Business { /** * 显示客户端提供的信息,并返回 */ public String echo(String message); } /** * 《构建高性能的大型分布式Java应用》 * 书中的示例代码 * 版权所有 2008---2009 */ package book.chapter1.webservice.impl; import javax.jws.WebService; import javax.jws.soap.SOAPBinding; /** * 描述:以webservice方式对外暴露的服务 * * @author bluedavy * 创建时间: 2009-2-11 */ @WebService(name="Business",serviceName="BusinessService",targetNamespace="http://webservice.chapter1.book/client") @SOAPBinding(style=SOAPBinding.Style.RPC) public class BusinessImpl implements Business { /* (non-Javadoc) * @see book.chapter1.webservice.Business#echo(java.lang.String) */ public String echo(String message) { if("quit".equalsIgnoreCase(message.toString())){ System.out.println("Server will be shutdown!"); System.exit(0); } System.out.println("Message from client: "+message); return "Server response:"+message; } } /** * 《构建高性能的大型分布式Java应用》 * 书中的示例代码 * 版权所有 2008---2009 */ package book.chapter1.webservice; import javax.xml.ws.Endpoint; import book.chapter1.webservice.impl.BusinessImpl; /** * 描述:基于Java Webservice实现的服务器端 * * @author bluedavy * 创建时间: 2009-2-11 */ public class Server { /** * @param args */ public static void main(String[] args) { Endpoint.publish("http://localhost:9527/BusinessService", new BusinessImpl()); System.out.println("Server has beed started"); } }
有了上面三个类之后,我们可以通过jdk bin目录下的wsimport命令来生成辅助调用代码,如下:
之后,我们发现jdk的工具给我们在book\chapter1\webservice\client下产生了两个类,Business.java,BusinessService.java#
这个两个类,我们其实可以不用看里面的细节(当然你要想看,那就看吧)
看看我们的client端
package book.chapter1.webservice; /** * 《构建高性能的大型分布式Java应用》 * 书中的示例代码 * 版权所有 2008---2009 */ import java.io.BufferedReader; import java.io.InputStreamReader; import book.chapter1.webservice.client.Business; import book.chapter1.webservice.client.BusinessService; /** * 描述:基于Webservice实现的客户端 * * @author bluedavy * 创建时间: 2009-1-4 */ public class Client { /** * @param args */ public static void main(String[] args) throws Exception{ BusinessService businessService=new BusinessService(); Business business=businessService.getBusinessPort(); BufferedReader systemIn=new BufferedReader(new InputStreamReader(System.in)); while(true){ String command=systemIn.readLine(); if(command==null || "quit".equalsIgnoreCase(command.trim())){ System.out.println("Client quit!"); try{ business.echo(command); } catch(Exception e){ // IGNORE } System.exit(0); } System.out.println(business.echo(command)); } } }
另外如果把代码改成下面的样子
@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自身技术实现消息方式的系统间通信的更多相关文章
- 分布式架构从零开始========》【基于Java自身技术实现消息方式的系统间通信】
基于Java自身包实现消息方式的系统间通信的方式有:TCP/IP+BIO,TCP/IP+NIO,UDP/IP+BIO,UDP/IP+NIO.下面就这4种类型一一做个详细的介绍: 一.TCP/IP+BI ...
- 基于JAVA WEB技术旅游服务网站系统设计与实现网上程序代写
基于JAVA WEB技术旅游服务网站系统设计与实现网上程序代写 专业程序代写服务(QQ:928900200) 随着社会的进步.服务行业的服务水平不断发展与提高,宾馆.酒店.旅游等服务行业的信息量和工作 ...
- WebService与RMI(远程调用方式实现系统间通信)
前言 本文是<分布式java应用基础与实践>读书笔记:另外参考了此博客,感觉讲的挺好的,尤其是其中如下内容: 另外,消息方式实现系统间通信本文不涉及.RMI则只采用spring RMI框架 ...
- 基于java开发的在线题库系统tamguo
简介 探果网(简称tamguo)是基于java开发的在线题库系统,包括 在线访问 后台运营 会员中心 书籍中心 管理员账号:system 密码:123456 因为线上数据和测试数据没有做到隔离,作者已 ...
- 系统间通信(5)——IO通信模型和JAVA实践 下篇
7.异步IO 上面两篇文章中,我们分别讲解了阻塞式同步IO.非阻塞式同步IO.多路复用IO 这三种IO模型,以及JAVA对于这三种IO模型的支持.重点说明了IO模型是由操作系统提供支持,且这三种IO模 ...
- 系统间通信(3)——IO通信模型和JAVA实践 上篇
来源:http://blog.csdn.net/yinwenjie 1.全文提要 系统间通信本来是一个很大的概念,我们首先重通信模型开始讲解.在理解了四种通信模型的工作特点和区别后,对于我们后文介绍搭 ...
- 系统间通信(10)——RPC的基本概念
1.概述 经过了详细的信息格式.网络IO模型的讲解,并且通过JAVA RMI的讲解进行了预热.从这篇文章开始我们将进入这个系列博文的另一个重点知识体系的讲解:RPC.在后续的几篇文章中,我们首先讲解R ...
- 系统间通信(9)——通信管理与RMI 下篇
接上文<架构设计:系统间通信(8)--通信管理与RMI 上篇>.之前说过,JDK中的RMI框架在JDK1.1.JDK1.2.JDK1.5.JDK1.6+几个版本中做了较大的调整.以下我们讨 ...
- 系统间通信(8)——通信管理与RMI 上篇
1.概述 在概述了数据描述格式的基本知识.IO通信模型的基本知识后.我们终于可以进入这个系列博文的重点:系统间通信管理.在这个章节我将通过对RMI的详细介绍,引出一个重要的系统间通信的管理规范RPC, ...
随机推荐
- KVM 时钟分析
1. 关于GToffset: KVM的guset时钟为gc0_COUNT 其中:mfc0 gc0_count = c0_COUNT+GToffset vcpu_run 以及 vcpu_reenter的 ...
- Spring Boot+maven打war包
存在一个坑: 官网文档 指出以下前3步做法,但是这样只可以打出可运行的jar包,要打出war包还要在文档后面的链接跳到另一个页面,才能找到第四步的做法,也就是最终能够打出war包,可能有些朋友有些粗心 ...
- python3中替换python2中cmp函数的新函数分析(lt、le、eq、ne、ge、gt)
本文地址:http://blog.csdn.net/sushengmiyan/article/details/11332589 作者:sushengmiyan 在python2中我们经常会使用cmp函 ...
- windows10,redhat6.5下python3.5.2使用cx_Oracle链接oracle
0.序言 项目主要使用oracle但是我不太喜欢其他编程语言,加上可能需要用python部署算法包,从oracle表中读出数据,处理完成后在放回oracle中去,所以在windows上就想到先用pyt ...
- 热烈庆祝自已厉精13年开发的 DB查询分析器 7.01(最新版本) 在中关村在线本月获得近6000次的下载量
中国本土程序员马根峰(CSDN专访马根峰:海量数据处理与分析大师的中国本土程序员)推出的个人作品----万能数据库查询分析器,中文版本 DB 查询分析器.英文版本DB Query Analyzer.它 ...
- Most Common Solutions to FRM-41839 and .tmp Files Not Being Deleted
In this Document Symptoms Changes Cause Solution References APPLIES TO: Oracle Application ...
- Android Studio 2.2 新功能详解
Tamic /文 -译 http://blog.csdn.net/sk719887916/article/details/52672688 Android的Studio 2.2 已经可以在官网下载了. ...
- App安全(一) Android防止升级过程被劫持和换包
文/ Tamic 地址/ http://blog.csdn.net/sk719887916/article/details/52233112 前言 APP 安全一直是开发者头痛的事情,越来越多的安全漏 ...
- Oracle11g R2创建PASSWORD_VERIFY_FUNCTION对应密码复杂度验证函数步骤
Oracle11g R2创建PASSWORD_VERIFY_FUNCTION对应密码复杂度验证函数步骤 运行测试环境:数据库服务器Oracle Linux 5.8 + Oracle 11g R2数据库 ...
- Android双击退出
重写返回键 private long tempTime = 0; /** * 双击退出 */ @Override public void onBackPressed() { long firstCli ...