这篇博客基本照搬了分布式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自身技术实现消息方式的系统间通信的更多相关文章

  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. Python笔记(一)——打印输出

    一.输出语句input    输出语句print 例:用户输入 username = input("username:") #变量名 显示的字符 password = input( ...

  2. idea+jsp+jstl c标签页面异常

    先在Schema and DTDs配置C.tld文件 最后提示是少包 网上很多方法都说少jstl.jar 折腾了很久 其实还少standard.jar 以前的解决方法(看下面) 把这两个包分别加到项目 ...

  3. Django笔记--模型

    ORM是"对象-关系-映射"的简称,在Django当中,ORM就是模型类的管理器对象.操作顺序是先定义模型类,再定义模型类管理器,然后在模型类中实例化一个模型类管理器的对象,作为模 ...

  4. page1

    1.1 常用的客户端技术:HTML. CSS. 客户端脚本技术 1.2 常用的服务器端技术:CGI .ASP .PHP (一种开发动态网页技术).ASP.NET(是一种建立动态web应用程序的技术,是 ...

  5. PHP MySQL 简介

    PHP MySQL 简介 通过 PHP,您可以连接和操作数据库. MySQL 是跟 PHP 配套使用的最流行的开源数据库系统. 如果想学习更多 MySQL 知识可以查看本站MySQL 教程. MySQ ...

  6. MongoDB $type条件操作符

    描述 在本章节中,我们将继续讨论MongoDB中条件操作符 $type. $type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果. MongoDB 中可以使用的类型如下表所示: 类型 ...

  7. 【Java集合系列】---总体框架

    个的组合,这些数据项可能共享某些特征,需要以某种操作方式一起进行操作,一般来说,这些数据项的类型都是相同的,或者基类相同(若使用的语言支持继承),列表或数组通常不认为是集合,因为其大小固定,但是事实上 ...

  8. Android Multimedia框架总结(二十四)MediaMuxer实现手机屏幕录制成gif图

    转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/53866405 前言:上篇中,介绍 ...

  9. JVM:类的生命周期

    类的生命周期 综述 1.    只有当一个类被切实使用到的时候才会被加载到虚拟机中(例如:new, 方法调用, A a = null;不算) 2.    若在加载一个类的过程中,有其他类被切实使用到, ...

  10. clang-format中文出错

    clang-format中文出错(金庆的专栏)VS2015 Community + clang-format(Visual Studio plugin installer, based on SVN ...