`
longgangbai
  • 浏览: 7281502 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java 网络编程,RMI,EJB之间那些屁事(一)

阅读更多

           在java的开发中不可避免的遇到java网络编程,RMI,EJB的使用,他们的关系是什么呢? RMI,远程方法调用(Remote Method Invocation)是Enterprise JavaBeans的支柱,是建立分布式Java应用程序的方便途径。RMI是非常容易使用的,但是它非常的强大。RMI的基于特定接口,RMI构架基于一个重要的原理:定义接口和定义接口的具体实现是分开的。

RMI基本原理

          要实现网络机器间的通讯,首先得来看看计算机系统网络通信的基本原理,在底层层面去看,网络通信需要做的就是将流从一台计算机传输到另外一台计算机,基于传输协议和网络IO来实现,其中传输协议比较出名的有http、tcp、udp等等,http、tcp、udp都是在基于Socket概念上为某类应用场景而扩展出的传输协议,网络IO,主要有bio、nio、aio三种方式,所有的分布式应用通讯都基于这个原理而实现,只是为了应用的易用,各种语言通常都会提供一些更为贴近应用易用的应用层协议。

       由此可知RMI底层采用网络编程的,既RMi基于套接字编程的,RMI是EJB远程调用的基础,仅用RMI技术就可以实现远程调用,使用EJB是为了实现组件,事物,资源池,集群等功能。

下面RMI学习:

服务接口:

package com.easyway.space.basic.network.sockets.rmi;

import java.rmi.Remote;
import java.rmi.RemoteException;

/**
 * Rmi服务接口
 * 创建远程接口及声明远程方法
 * 远程服务接口实现java.rmi.Remote 的接口
 * 
 * @author longgangbai
 *
 */
public interface RmiMonitorService extends Remote{
	public int interactive(int funindex ,String param)throws RemoteException;
}

 
服务接口的实现:

package com.easyway.space.basic.network.sockets.rmi;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

/**
 * Rmi服务接口的实现
 * 实现远程接口及远程方法(继承UnicastRemoteObject)
 * RMI 实现UnicastRemoteObject类必须实现相关的空构造函数并抛出RemoteException
 * @author longgangbai
 *
 */
public class RmiMonitorServiceImpl extends UnicastRemoteObject implements RmiMonitorService{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	/**
	 * 空构造函数
	 * @throws RemoteException
	 */
	protected RmiMonitorServiceImpl() throws RemoteException {
		super();
	}
    
    /**
	 * 服务请求频率和监控信息
     * @param funindex
      * @param param
     */
	public int interactive(int funindex, String param) throws RemoteException {
		return funindex;
	}

}

 

启动并注册RMI服务:

package com.easyway.space.basic.network.sockets.rmi;

import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
/**
 * Rmi远程监控的服务端
 * 
 * 启动RMI注册服务,并注册远程对象
 * 
 * @author longgangbai
 *
 */
public class RmiMonitorServer {
	
	public String host="localhost";
	public int port=8889;
	/**
	 * 初始化远程服务的方法
	 */
	public void init(){
		try {
			    //注册本地端口
				LocateRegistry.createRegistry(port);
				RmiMonitorService monitor=new RmiMonitorServiceImpl();
				//rmi绑定本地目录和命名服务
				Naming.bind("//"+host+":"+port+"/monitor",monitor);
			} catch (MalformedURLException e) {
				System.out.println("发生URL异常!" +e.getMessage());;
			} catch (AlreadyBoundException e) {
				System.out.println("发生重复绑定对象异常!" +e.getMessage());
			}catch (RemoteException e) {
				System.out.println("创建远程对象发生异常!" +e.getMessage());
			}
	}
	
	public static void main(String[] args) {
		RmiMonitorServer  rmi=new RmiMonitorServer();
		System.out.println("RMI服务初始化.....");
		rmi.init();
	}

}

 客户端查找并使用存根:

package com.easyway.space.basic.network.sockets.rmi;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.util.HashMap;
import java.util.Map;

/**
 * Rmi监控的客户端的服务
 * 
 * 客户端查找远程对象,并调用远程方法
 * 
 * @author longgangbai
 *
 */
public class RmiMonitorClient {
	//用户缓存使用的实例
	public Map<Class,Object> serviceMap=new HashMap<Class,Object>();
	public RmiMonitorService monitorService;
	public String ip="localhost";
	public int port=8889;
	public int interactive(int funindex ,String param)
	{
		 
		 try {
			 if(monitorService==null)
			 {
				 monitorService=getMonitorService(RmiMonitorService.class);
			 }
			return monitorService.interactive(funindex, param);
		} catch (RemoteException e) {
			e.printStackTrace();
		}
		return 0;
	}
    /**
     * 查找服务对象的应用
     * @param clazz
     * @return
     */
	public RmiMonitorService  getMonitorService(Class clazz){
		try {
			Object object=serviceMap.get(clazz);
			if(object==null)
			{
				monitorService=(RmiMonitorService)Naming.lookup("rmi://"+ip+":"+port+"/monitor");
				serviceMap.put(RmiMonitorService.class, monitorService);
			}else{
			   monitorService=(RmiMonitorService)serviceMap.get(clazz);
			}
			return monitorService;
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NotBoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return monitorService;
	}
	
	public static void main(String[] args) {
		RmiMonitorClient  client=new RmiMonitorClient();
		int result=client.interactive(9, "i love you");
		System.out.println("result ="+result);
	}
}

 

分享到:
评论
4 楼 longgangbai 2012-07-04  
lhc1986 写道
rmi貌似不是基于套接字编程的吧,虽然都是通过ip+端口形式

貌似是的,个人简介纯属个人简介。
3 楼 lhc1986 2012-06-21  
rmi貌似不是基于套接字编程的吧,虽然都是通过ip+端口形式
2 楼 longgangbai 2011-01-17  
晕死,兄弟,EJB的分布式与ip没有关系的,不知道哥们怎么想的?ip改为非localhost如果不行,怎么还是分布式呢?
空谷悠悠 写道
非常的失望!
这里似乎服务程序和客户端程序都必须运行在本机,假如如客户端运行在其它机器上呢?LZ尝试或将localhost改为其它机器的IP吗?如果行,又该怎么操作,求解答

晕死,兄弟,EJB的分布式与ip没有关系的,不知道哥们怎么想的?ip改为非localhost如果不行,怎么还叫分布式呢?
1 楼 空谷悠悠 2011-01-12  
非常的失望!
这里似乎服务程序和客户端程序都必须运行在本机,假如如客户端运行在其它机器上呢?LZ尝试或将localhost改为其它机器的IP吗?如果行,又该怎么操作,求解答

相关推荐

    Java网络编程(第4版)PDF

    《Java网络编程(第4版)》是一本深入探讨Java平台上的网络编程技术的专业书籍,适合想要提升Java通讯技术的学者阅读。此书全面覆盖了Java网络编程的基础和高级概念,帮助开发者理解如何利用Java语言构建高效、可靠的...

    java rmi java rmi

    java rmi java rmijava rmi javajava rmi java rmi rmi

    网络编程入门rmi初级教程

    网络编程是计算机科学中的一个重要领域,它涉及到通过网络在不同计算机之间交换信息。RMI(Remote Method Invocation,远程方法调用)是Java平台提供的一种机制,用于实现分布式计算,允许一个Java对象调用位于另一...

    liaotianshi.rar_RMI聊天室_java 网络_rmi _rmi 聊天_网络聊天室

    RMI是Java平台提供的一种分布式计算机制,允许在不同的Java虚拟机之间透明地调用对象的方法,即使这些对象位于不同的网络节点上。 **RMI原理:** RMI的核心思想是将对象的实例化和方法调用过程解耦,使得远程对象...

    java网络编程

    java网络编程包括socket tcp/udp io/nio讲解 http协议 jdbc rmi java的安全框架等知识

    Java网络编程与分布式计算

    RMI(远程方法调用)是Java实现分布式计算的一种方式,它允许对象在不同的JVM之间透明地调用方法,仿佛它们都在同一个JVM中一样。EJB(企业JavaBean)和Spring框架的远程服务支持也是分布式计算的重要工具。 另外,...

    Java网络编程(第3版) 中文版

    无论你是经验丰富的网络开发人员、Java程序员新手,还是只希望对Java网络编程稍有些了解的人,都会发现《Java编程(第三版)》将成为你的书库中一个重要的部分。一旦开始使用Java网络API,只要你能想到它就能够做...

    RMI.rar_Java RMI_java.rmi_java.rmi.Remot_remote

    Java RMI(远程方法调用)是Java编程语言中的一项核心技术,自JDK 1.1版本起就被引入,用于构建分布式系统。RMI允许Java对象在不同的Java虚拟机(JVMs)之间进行交互,仿佛这些对象是在同一台机器上一样。这种技术的...

    java_rmi.rar_RMI java_java.rmi

    Java RMI(Remote Method Invocation,远程方法调用)是Java平台提供的一种分布式计算技术,它允许Java对象在不同的网络环境中进行交互,就像它们在同一个进程内一样。RMI是Java在分布式系统领域的核心特性,极大地...

    java网络编程与分布式计算

    10. **RMI(远程方法调用)**:Java的RMI机制使得Java对象可以在不同的JVM之间进行交互,实现分布式服务。 11. **JMS(Java消息服务)**:用于在分布式环境中发送和接收消息,是解耦和异步处理的关键技术。 12. **...

    java 网络编程 代码集合

    在这个"java 网络编程 代码集合"中,包含了多个示例项目,覆盖了从基础的TCP/IP通信到高级的RMI(远程方法调用)以及SMTP(简单邮件传输协议)的应用。下面将对这些知识点进行详细解释。 1. **TCP/ECHO**:TCP...

    java RMI技术实现的网络聊天室

    10. **网络编程**:RMI涉及TCP/IP网络编程,客户端和服务器之间通过Socket进行通信。理解套接字编程的基本原理有助于深入理解RMI的工作机制。 以上是关于“java RMI技术实现的网络聊天室”的主要知识点。通过这个...

    Java中的EJB编程实例代码

    Java中的EJB编程实例代码,内容有:简单的EJB、无状态SessionBean、有状态SessionBean、BMP位图实例、cmp实例、Message-Driven Bean、JNDI的使用、112各种EJB之间的调用、B-S结构EJB、 C-S结构EJB、UML建模与J2EE...

    java RMI实现代码

    Java RMI(Remote Method Invocation,远程方法调用)是Java平台提供的一种分布式计算技术,它允许在不同的Java虚拟机之间进行远程对象的调用。RMI使得开发者可以像调用本地对象一样调用网络上的对象,极大地简化了...

    java_in_rmi.rar_Java RMI_RMI java_rmi _精通rmi

    它允许Java对象在不同的Java虚拟机(JVM)之间进行交互,仿佛它们都在同一台机器上运行。这个"java_in_rmi.rar"压缩包包含了学习和精通RMI的基础资料,非常适合初学者深入理解这一主题。 首先,RMI的核心概念是远程...

    java文件传输RMI

    通过RMI,Java程序可以在网络上的不同计算机之间透明地调用对象的方法,仿佛这些对象都在本地一样。这一特性使得Java在构建分布式应用时具有强大的能力,尤其在文件传输场景中,RMI可以高效地实现在网络中的大文件,...

    rmi.zip_Java RMI_java rmi网络_java源代码 RMI

    它允许Java对象在不同的JVM(Java虚拟机)之间进行通信,仿佛这些对象都在同一台机器上运行。RMI使得开发分布式系统变得更加简单,因为开发者可以像调用本地方法一样调用远程对象的方法。 在Java RMI中,主要有以下...

    Rmi.rar_Java RMI_RMI java_java RMI 线程_rmi

    Java RMI(Remote Method Invocation)是Java平台提供的一种分布式计算技术,它允许一个Java对象调用网络另一端的Java对象的方法,仿佛它们在同一个进程中执行。这个教程“Rmi.rar”显然包含了关于如何使用Java RMI...

    java中的RMI程序

    Java中的RMI(Remote Method Invocation,远程方法调用)是一种机制,允许在不同的Java虚拟机之间透明地调用对象的方法,即便这些对象位于不同的网络节点上。RMI是Java平台的核心特性之一,它极大地简化了分布式系统...

    RMI.zip_Java RMI_RMI java_rmi

    Java Remote Method Invocation(RMI)是Java平台提供的一种分布式计算技术,它允许在不同网络节点上的Java对象之间进行远程调用。RMI是Java多层架构中的重要组成部分,尤其适用于构建分布式应用程序,如服务器端...

Global site tag (gtag.js) - Google Analytics