基于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, ...
随机推荐
- IOS JavaScriptCore介绍
本文主要转自:https://www.jianshu.com/p/cdaf9bc3d65d http://blog.csdn.net/u011993697/article/details/515772 ...
- 反向Ajax之Socket.io
1.什么是反向ajax? 传统的ajax的困惑? 新需求--当服务器端数据发生变化时,客户端(浏览器端)如何即时得到通知呢? 找一些实际的案例:客服系统.在线聊天 这类应用,有一个显著的特点: 数据并 ...
- Servlet 执行流程 生命周期 ServletConfig 线程安全
Day34 servlet 三.如何使用Servlet 1.继承GenericServlet类(通用) (1)GenericServlet类有一个关键的设计,定义了一个私有的ServletConfig ...
- Java面试06|项目相关介绍
1.明确你的项目到底是做什么的,有哪些功能 广告投放机:项目主要是为移动端有针对性的进行广告展示. 媒体管理平台SSP:为媒体端实现多种变现途径 (1)广告投放机中关于广告检索与排序的功能 1.广告检 ...
- Java中使用long类型实现精确的四则运算
引子 Effective Java 2nd Edition 第48条建议:如果需要精确的答案,请避免使用float和doble.float和double类型主要是为了科学计算和工程计算而设计的.他们执 ...
- JVM:类的生命周期
类的生命周期 综述 1. 只有当一个类被切实使用到的时候才会被加载到虚拟机中(例如:new, 方法调用, A a = null;不算) 2. 若在加载一个类的过程中,有其他类被切实使用到, ...
- proc文件系统探索 之 根目录下的文件[三]
包括对proc根目录下meminfo文件的解析. > cat /proc/meminfo 读出的内核信息进行解释,下篇文章会简单对读出该信息的代码进行简单的分析. MemTotal: 507 ...
- 在线看Android系统源码,那些相见恨晚的几种方案
请尊重分享成果,转载请注明出处,本文来自逆流的鱼yuiop,原文链接:http://blog.csdn.net/hejjunlin/article/details/53454514 前言:最近在研究M ...
- Linux 高性能服务器编程——IP协议详解
1 IP服务特点 IP协议是TCP/IP协议族的动力,它为上层协议提供无状态.无连接.不可靠的服务. 无状态:IP通信双方不同步传输数据的状态信息,因此IP数据包的发送.传输和接收都是无序的. ...
- Android中Snackbar的介绍以及使用
Android中Snackbar的介绍以及使用 介绍 Snackbar可以说是Toast的升级版,不仅有显示信息的功能,还可以添加一个Action,实现点击功能,可以右滑删除. 效果图 Snackba ...