- 浏览: 7325763 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (1546)
- 企业中间件 (236)
- 企业应用面临的问题 (236)
- 小布Oracle学习笔记汇总 (36)
- Spring 开发应用 (54)
- IBatis开发应用 (16)
- Oracle基础学习 (23)
- struts2.0 (41)
- JVM&ClassLoader&GC (16)
- JQuery的开发应用 (17)
- WebService的开发应用 (21)
- Java&Socket (44)
- 开源组件的应用 (254)
- 常用Javascript的开发应用 (28)
- J2EE开发技术指南 (163)
- EJB3开发应用 (11)
- GIS&Mobile&MAP (36)
- SWT-GEF-RCP (52)
- 算法&数据结构 (6)
- Apache开源组件研究 (62)
- Hibernate 学习应用 (57)
- java并发编程 (59)
- MySQL&Mongodb&MS/SQL (15)
- Oracle数据库实验室 (55)
- 搜索引擎的开发应用 (34)
- 软件工程师笔试经典 (14)
- 其他杂项 (10)
- AndroidPn& MQTT&C2DM&推技术 (29)
- ActiveMQ学习和研究 (38)
- Google技术应用开发和API分析 (11)
- flex的学习总结 (59)
- 项目中一点总结 (20)
- java疑惑 java面向对象编程 (28)
- Android 开发学习 (133)
- linux和UNIX的总结 (37)
- Titanium学习总结 (20)
- JQueryMobile学习总结 (34)
- Phonegap学习总结 (32)
- HTML5学习总结 (41)
- JeeCMS研究和理解分析 (9)
最新评论
-
lgh1992314:
[u][i][b][flash=200,200][url][i ...
看看mybatis 源代码 -
尼古拉斯.fwp:
图片根本就不出来好吧。。。。。。
Android文件图片上传的详细讲解(一)HTTP multipart/form-data 上传报文格式实现手机端上传 -
ln94223:
第一个应该用排它网关吧 怎么是并行网关, 并行网关是所有exe ...
工作流Activiti的学习总结(八)Activiti自动执行的应用 -
ZY199266:
获取不到任何消息信息,请问这是什么原因呢?
ActiveMQ 通过JMX监控Connection,Queue,Topic的信息 -
xiaoyao霄:
DestinationSourceMonitor 报错 应该导 ...
ActiveMQ 通过JMX监控Connection,Queue,Topic的信息
使用RMI和EJB的童鞋,都知道EJB有客户端存根,和服务端骨架的说法。客户端调用服务其实是调用客户端的存根,客户端的存根调用相关的代理,代理向服务端发送请求,服务端响应请求,并将请求信息发送给代理,代理将结果返回给存根的。
封装请求信息的类:
package com.easyway.space.basic.network.sockets.remoting.proxy; import java.io.*; /** * 关于远程访问协议的信息 * 用于封装请求中各种信息 * @author longgangbai * */ public class Call implements Serializable{ private String className; //表示类名 private String methodName; //表示方法名 private Class[] paramTypes; //表示方法参数类型 private Object[] params; //表示方法参数值 private Object result; //表示方法的返回值或者方法抛出的异常 public Call(){} public Call(String className,String methodName,Class[] paramTypes, Object[] params){ this.className=className; this.methodName=methodName; this.paramTypes=paramTypes; this.params=params; } public String getClassName(){return className;} public void setClassName(String className){this.className=className;} public String getMethodName(){return methodName;} public void setMethodName(String methodName){this.methodName=methodName;} public Class[] getParamTypes(){return paramTypes;} public void setParamTypes(Class[] paramTypes){this.paramTypes=paramTypes;} public Object[] getParams(){return params;} public void setParams(Object[] params){this.params=params;} public Object getResult(){return result;} public void setResult(Object result){this.result=result;} public String toString(){ return "className="+className+" methodName="+methodName; } }
处理客户端的信息:
package com.easyway.space.basic.network.sockets.remoting.proxy; import java.io.*; import java.net.*; /** * 关于客户端的连接信息 * * 客户端的处理的信息 * * @author longgangbai * */ public class Connector { //客户端的主机ip private String host; //客户端的主机端口 private int port; //客户端远程对象 private Socket skt; //客户端读取对象 private InputStream is; private ObjectInputStream ois; //客户端写入对象 private OutputStream os; private ObjectOutputStream oos; public Connector(String host,int port)throws Exception{ this.host=host; this.port=port; connect(host,port); } /** * 设置对象序列化对象 * @param obj * @throws Exception */ public void send(Object obj)throws Exception{ oos.writeObject(obj); } /** * 获取序列化对象 * @return * @throws Exception */ public Object receive() throws Exception{ return ois.readObject(); } public void connect()throws Exception{ connect(host,port); } /** * 连接客户端 * @param host * @param port * @throws Exception */ public void connect(String host,int port)throws Exception{ skt=new Socket(host,port); os=skt.getOutputStream(); oos=new ObjectOutputStream(os); is=skt.getInputStream(); ois=new ObjectInputStream(is); } /** * 关闭客户端的资源的信息 */ public void close(){ try{ }finally{ try{ ois.close(); oos.close(); skt.close(); }catch(Exception e){ System.out.println("Connector.close: "+e); } } } }
远程访问的代理工厂 获取代理的对象
package com.easyway.space.basic.network.sockets.remoting.proxy; import java.lang.reflect.*; /** * 远程访问的代理工厂 * * 获取代理的对象 * @author longgangbai * */ public class ProxyFactory { /** * 获取远程访问的bean 对象 * @param classType * @param host * @param port * @return */ public static Object getProxy(final Class classType,final String host,final int port){ InvocationHandler handler=new InvocationHandler(){ public Object invoke(Object proxy,Method method,Object args[]) throws Exception{ //调用远程对象返回的结果信息 Connector connector=null; try{ //设置远程访问的客户端信息 connector=new Connector(host,port); //构建远程访问的信息 Call call=new Call(classType.getName(), method.getName(),method.getParameterTypes(),args); //发送客户端请求的信息 connector.send(call); //接受服务端发送的结果 call=(Call)connector.receive(); //获取结果信息 Object result=call.getResult(); if(result instanceof Throwable) throw new RemoteException((Throwable)result); else return result; }finally{ if(connector!=null) connector.close(); } } }; //客户端返回执行代理 return Proxy.newProxyInstance(classType.getClassLoader(), classType.getInterfaces(),handler); } }
服务端代理工厂:
package com.easyway.space.basic.network.sockets.remoting.proxy; import java.io.InputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.OutputStream; import java.lang.reflect.Method; import java.net.ServerSocket; import java.net.Socket; import java.util.HashMap; import java.util.Map; import com.easyway.space.basic.patterns.proxys.HelloServiceImpl; /** * 远程代理的服务处理类 * @author Owner * */ public class ServiceProxyExporterServer { //用于缓存服务端的实例对象 private Map<String,Object> remoteObjects=new HashMap<String,Object>(); /** * 注册服务端的实例对象 * @param className * @param remoteObject */ public void register(String className,Object remoteObject){ remoteObjects.put( className,remoteObject); } /** * 处理相关的客户端请求的信息 * @throws Exception */ public void service()throws Exception{ //服务端的网络的对象 ServerSocket serverSocket = new ServerSocket(8000); System.out.println("服务器启动."); while(true){ //获取客户端的网络对象 Socket socket=serverSocket.accept(); //获取客户端的远程读写对象 InputStream in=socket.getInputStream(); ObjectInputStream ois=new ObjectInputStream(in); OutputStream out=socket.getOutputStream(); ObjectOutputStream oos=new ObjectOutputStream(out); //获取远程执行的对象 Call call=(Call)ois.readObject(); System.out.println(call); //获取远程调用的方法 call=invoke(call); //将执行结果写入到序列化对象中 oos.writeObject(call); //关闭相关的资源 ois.close(); oos.close(); socket.close(); } } /** * 获取服务端响应的结果的信息,并封装返回结果 * * @param call * @return */ public Call invoke(Call call){ Object result=null; try{ //获取执行的方法各种信息 String className=call.getClassName(); String methodName=call.getMethodName(); Object[] params=call.getParams(); Class classType=Class.forName(className); Class[] paramTypes=call.getParamTypes(); //获取远程访问方法 Method method=classType.getMethod(methodName,paramTypes); //获取执行执行对象 Object remoteObject=remoteObjects.get(className); if(remoteObject==null){ throw new Exception(className+"的远程对象不存在"); }else{ //执行远程方法 result=method.invoke(remoteObject,params); } }catch(Exception e){ result=e; } //设置远程方法的结果 call.setResult(result); return call; } public static void main(String args[])throws Exception { ServiceProxyExporterServer server=new ServiceProxyExporterServer(); server.register("com.easyway.space.basic.patterns.proxys.HelloService",new HelloServiceImpl()); server.service(); } }
客户端调用:
package com.easyway.space.basic.network.sockets.remoting.proxy; import com.easyway.space.basic.patterns.proxys.HelloService; public class RemoteProxyClient { public static void main(String args[])throws Exception { //创建动态代理类实例 HelloService helloService2= (HelloService)ProxyFactory.getProxy(HelloService.class,"localhost",8000); System.out.println(helloService2.getClass().getName()); System.out.println(helloService2.echo("hello")); System.out.println(helloService2.getTime()); } }
发表评论
-
[转] J2EE集群原理
2013-07-23 09:57 4524J2EE集群原理 什么是集群呢?总的来说,集群包括两个概念 ... -
[转]J2EE 中间件 JVM 集群
2013-07-23 09:51 25151 前言越来越多的关键任务和大型应用正运行在J2EE平台上,象 ... -
[转]通过 Terracotta实现基于Tomcat的Web应用集群
2013-07-23 09:45 5125转载自: http://blog.csdn.n ... -
Terrocotta - 基于JVM的Java应用集群解决方案
2013-07-23 09:47 2496前言 越来越多的企业 ... -
Quartz与Terracotta的集成
2013-07-22 20:39 2779Quartz与Terracotta的集成 • 综述 • 配置 ... -
Terracotta服务器的不同配置方式
2013-07-22 20:37 2150Terracotta Server有4类配置方式:1、单机,无 ... -
Terracotta 3.2.1简介 (一)
2013-07-22 20:25 2481Terracotta开源项目以及Terracotta公司 ... -
Jvm级别的集群(转)
2013-07-22 20:14 2327Java的垃圾回收机制( ... -
【转】java并发编程-Executor框架
2012-11-28 13:20 3727转载自 http://www.iteye.com/topic ... -
【转】互联网常见Open API文档资源
2012-07-17 17:22 2410原文出处:http://www.williamlong.i ... -
最近项目开发中遇到几个问题
2011-11-25 18:49 18211.JDK1.60安装之后与Apache CXF开发WebSe ... -
Java 文件合并功能
2011-08-25 08:44 3756在项目中在一个文件目录中存放多个临时文件合并文件功 ... -
Java 分割功能实现
2011-08-25 08:39 2788在项目针对比较大的文件需要文件的分割功能,特意写了一个 ... -
在JVM关闭的时候线程该怎么关闭呢
2011-08-21 13:11 2204在编写线程类的时候设置一个标志,用于表示是否开始执行 ... -
Java获取系统IP地址
2011-08-21 13:01 6033在一个项目中如果你想获取系统的ip地址那么可能许多同 ... -
java 网络编程,RMI,EJB之间那些屁事(一)
2010-12-12 14:18 3031在java的开发中不可避免的遇到java ... -
JMX 和系统管理
2010-12-04 16:03 5615检测 ... -
关于JDK1.5不支持创建泛型数组的解决方案
2009-12-05 14:59 3819在项目中需要 ... -
JDK1.5中的打印服务
2009-12-01 13:23 2579package com.unutrip.print; imp ... -
Java中静态变量的适用场景
2009-11-28 15:32 2114Java类中的静态变量在程序运行期间,其内存空间对所有 ...
相关推荐
《Java网络编程(第4版)》是一本深入探讨Java平台上的网络编程技术的专业书籍,适合想要提升Java通讯技术的学者阅读。此书全面覆盖了Java网络编程的基础和高级概念,帮助开发者理解如何利用Java语言构建高效、可靠的...
Java网络编程和分布式计算是Java语言中非常重要的技术领域,它们让Java程序员能够开发出可以跨网络进行通信和协作的应用程序。Java作为一种成熟的编程语言,拥有强大的网络和分布式计算能力,这得益于其丰富的API和...
java网络编程包括socket tcp/udp io/nio讲解 http协议 jdbc rmi java的安全框架等知识
RMI是Java平台提供的一种分布式计算机制,允许在不同的Java虚拟机之间透明地调用对象的方法,即使这些对象位于不同的网络节点上。 **RMI原理:** RMI的核心思想是将对象的实例化和方法调用过程解耦,使得远程对象...
网络编程是计算机科学中的一个重要领域,它涉及到通过网络在不同计算机之间交换信息。RMI(Remote Method Invocation,远程方法调用)是Java平台提供的一种机制,用于实现分布式计算,允许一个Java对象调用位于另一...
### Java RMI 分布式编程心得详解 #### 一、Java RMI 分布式编程概述 Java远程方法调用(Remote Method Invocation, RMI)是一种让位于不同Java虚拟机(Java Virtual Machine, JVM)上的对象能够互相调用彼此方法...
Java网络编程与分布式计算是计算机科学中的重要领域,尤其在当今云计算和大数据时代,其重要性日益凸显。本文将深入探讨这两个主题,并结合文件名称"Java网络编程与分布式计算"来解析相关知识点。 首先,Java网络...
Java网络编程(第3版) 《Java网络编程》第三版会为你介绍Java网络API的最新特性。本书讨论了JDK 1.4和1.5(现在已命名为J2SE 5)中所做的所有修改和增补。本书内容全面,涵盖了从网络基础知识到远程方法调用(RMI)...
二、高级Java网络编程 6. **NIO(非阻塞I/O)**:Java的非阻塞I/O模型通过选择器(Selector)和通道(Channel)提供更高效的数据传输,适合高并发场景。 7. **异步I/O(AIO)**:Java NIO.2引入了异步I/O,允许...
Java RMI(Remote Method Invocation,远程方法调用)是Java平台提供的一种分布式计算技术,它允许Java对象在不同的网络环境中进行交互,就像它们在同一个进程内一样。RMI是Java在分布式系统领域的核心特性,极大地...
RMI是一种Java技术,它允许开发者创建分布式应用程序,其中Java对象可以在网络的不同节点之间进行通信。通过RMI,一个Java程序能够调用位于另一台计算机上的Java对象的方法,就好像它们在同一台机器上一样。这种能力...
在Java世界中,远程方法调用(Remote Method Invocation,RMI)是一种强大的技术,它允许在不同的Java虚拟机(JVM)之间透明地调用对象的方法。本篇将深入探讨如何利用JDK 1.5版本搭建一个基本的分布式Java RMI程序...
Java RMI(远程方法调用)是Java编程语言中的一项核心技术,自JDK 1.1版本起就被引入,用于构建分布式系统。RMI允许Java对象在不同的Java虚拟机(JVMs)之间进行交互,仿佛这些对象是在同一台机器上一样。这种技术的...
Java中的EJB编程实例代码,内容有:简单的EJB、无状态SessionBean、有状态SessionBean、BMP位图实例、cmp实例、Message-Driven Bean、JNDI的使用、112各种EJB之间的调用、B-S结构EJB、 C-S结构EJB、UML建模与J2EE...
在这个"java 网络编程 代码集合"中,包含了多个示例项目,覆盖了从基础的TCP/IP通信到高级的RMI(远程方法调用)以及SMTP(简单邮件传输协议)的应用。下面将对这些知识点进行详细解释。 1. **TCP/ECHO**:TCP...
Java RMI(Remote Method Invocation,远程方法调用)是Java平台提供的一种分布式计算技术,它允许在不同的Java虚拟机之间进行远程对象的调用。RMI使得开发者可以像调用本地对象一样调用网络上的对象,极大地简化了...
10. **网络编程**:RMI涉及TCP/IP网络编程,客户端和服务器之间通过Socket进行通信。理解套接字编程的基本原理有助于深入理解RMI的工作机制。 以上是关于“java RMI技术实现的网络聊天室”的主要知识点。通过这个...
它允许Java对象在不同的Java虚拟机(JVM)之间进行交互,仿佛它们都在同一台机器上运行。这个"java_in_rmi.rar"压缩包包含了学习和精通RMI的基础资料,非常适合初学者深入理解这一主题。 首先,RMI的核心概念是远程...
它允许Java对象在不同的JVM(Java虚拟机)之间进行通信,仿佛这些对象都在同一台机器上运行。RMI使得开发分布式系统变得更加简单,因为开发者可以像调用本地方法一样调用远程对象的方法。 在Java RMI中,主要有以下...