基于java自身技术实现消息方式的系统间通信
来源:互联网 发布:apache是干什么用的 编辑:程序博客网 时间:2024/05/21 10:47
这篇博客基本照搬了分布式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 */@WebServicepublic 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;}@Overridepublic 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{//下面我没有写端口 那就默认是1099Registry 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命令来生成辅助调用代码,如下:
这个两个类,我们其实可以不用看里面的细节(当然你要想看,那就看吧)
看看我们的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/
0 0
- 基于java自身技术实现消息方式的系统间通信
- Java——基于java自身包实现消息系统间的通信(TCP/IP+BIO)
- Java——基于java自身包实现消息系统间的通信(TCP/IP+NIO)
- [分布式java]基于JavaAPI实现消息方式的系统间通信:TCP/IP+BIO
- [分布式java]基于JavaAPI实现消息方式的系统间通信:TCP/IP+NIO
- [分布式java]基于JavaAPI实现消息方式的系统间通信:UDP/IP+BIO
- [分布式java]基于JavaAPI实现消息方式的系统间通信:UDP/IP+NIO
- 分布式Java应用之基于消息方式实现系统间的通信(2)
- java分布式开发TCP/IP NIO无阻塞 Socket((基于消息方式实现系统间的通信) )(转)
- 基于WebService实现远程调用方式的系统间通信
- 基于WebService实现远程调用方式的系统间通信
- 分布式开发——JAVA自身系统通信方式
- 基于消息实现系统间的通信(BIO,NIO,AIO)学习。
- 基于消息实现系统间的通信(BIO,NIO,AIO)
- 基于消息实现系统间的通信(BIO,NIO,AIO)
- 用消息的方式实现线程通信
- 基于boost 线程并行技术实现消息队列方式
- 基于boost 线程并行技术实现消息队列方式[记录]
- 调用手机系统进行拍摄视频
- Telerik Report报表加合计
- mysql 时间戳 与 日期类型的转换
- Android拨打电话Intent.ACTION.CALL
- Linq To Objective-C
- 基于java自身技术实现消息方式的系统间通信
- durid 关闭时报错
- Oracle使用触发器实例
- 做一个 页面失效的功能
- JS中typeof与instanceof的区别
- C++primer--lambda表达式-参数绑定之bind
- UIImage、UIData之间转换、跨平台TCP传输
- HDU 1708 hash
- Java定时执行任务