`
yeshucheng
  • 浏览: 24624 次
  • 性别: Icon_minigender_1
  • 来自: 登陆上海
社区版块
存档分类
最新评论
阅读更多

    大家都知道对于互联网的世界网络通讯是其本质特征。而对于一个分布式式计算来说更是如此。在它的环境中使用了客户/服务器结构特点,使用的一个核心技术就是网络通讯层。在最早的OSI的概念基础上,建立了完善具体协议层。而客户想要能够与位于其他物理层主机上的服务器通讯,需要能够想服务器发送数据,然后以某种方式获得响应。这当中就牵涉到我们熟悉的协议层面了,在这里就不再复述这些协议概念了。对于网络通讯来说我们所要了解的是最为常用的就是两种连接方式:无连接协议(UDP)、面向连接协议(TCP/IP)。

       多数网络编程库中(以JAVA为主来说明),在JAVA平台中一样的提供了这些元素。而作为面向连接协议来说使用的是套接字(Socket)进行了更进一步的抽象描述。一般我们在JAVA的网络编程中都觉得在使用套接字这块相对方便,它不需要你去更多的了解操作系统的细节以及硬件的传递处理方式。TCP/IP的所有细节之处都得到了套接字的封装使用,让程序员关注到业务层面的处理。

       对象是一种抽象思维物质,对于计算机来说它只对数字电路的存储方式能够加以识别而且在网络传输当中也是一种信号量,而这一切只有使用字节流方式传输才是真正需要做到的。所以在本地主机与远程服务器的通讯传输就在对象与字节流之间不断相互转化才是我们真正需要的人性物质与机器所需要的。(有点墨迹了,切入整体)总体来说就是需要两种方式来认定这种传输行为:编组(Marshalling)与反编组(Unmarshalling)。而这一切的手段方式才是通过:序列化(Serialiazable)与反序列化的方式不断完成。如下图所示:

 

图:对象到字节再到对象的转换

       对于数据的传输本质就是上图说明的。那我们一般是如何使用套接字来构造我们这一行为呢?对于这里强调的主要是一种大致方法说明,所以只能以部分代码来说明客户端怎么来发送这个请求。

Socket socket=new Socket("http://www.wgh.com.cn",8888);

    OutputStream out=socket.getOutputStream();

    ObjectOutputStream obj=new ObjectOutputStream(out);

    obj.writeObject(object);

    InputStream in=socket.getInputStream();

    ObjectInputStream objIn=new ObjectInputStream(in);

    Object objFoo=(Object)objIn.readObject();

    //todo 这里就是具体进行操作的相关传值参数处理了

    obj.close();

    objIn.close();

    socket.close();

而作为服务器的接收方则把以上数据做一个逆转相反处理就可以。即服务器需要读取发送过来的对象数据,最终得到结果。现在假设还是一个甚至更多这样的对象处理,我们又要处理和以上代码差不多的过程。好,到这里我们可曾想到难道没有一种办法把这些过多的重复过程做一个通用的方式来提供吗?我如果不想去做这些繁杂的对象处理可以吗?比如,我想直接得到:

//其中clientObjectji就是从客户端传输过来的副本;

MyObject myObject=server.getFoo(clientObject);

这样就能让我们把底层的那些庞杂数据转换能够透明封装起来呢?既然这个问题一经提出,那就意味着肯定有很多类似的需求。技术永远都是在需求的提出应运而生的。上面提出的需求就是我们要讨论的,既然我们想把一些套接字的重复处理过程来个封装清理,那需要面对的问题是什么呢?

1.      能够把所有的相同处理过程全部都移入到服务端呢?

2.      对于客户端来说能否只预留接口行为呢?

3.      把过多的复杂处理过程完善的做个封装?

4.      如果以上过程能够形成,那客户端又是如何办到可以连接到服务器端的组件行为呢?

既然能够把遇到的问题提出然后总结出来也就意味着我们需要去解决它。不知道是否还

记得设计模式中有一个叫:代理模式?没错,就是这个代理模式开始我们的描述。代理是一个实现给定接口的对象,但是不直接去执行代码结果,而是代表其他一些对象执行实际计算的对象。怎么理解这个话呢?举例说,如今很多城市都有火车票或者飞机票的代售点,这里的代售点其实就是采用了一种代理机制。我们想买某天的火车或者飞机票有时候并不需要到火车站或者飞机票的总点去购买票,而是找一个你最近的代售点去购买。代售点就是起到一个中间桥梁的作用,至于买票人员无需关心他们如何去订购,这些具体的动作都由他们内部去处理,你只关心最终是否有你需要的票就行。知道这个原理接下来就好理解很多了,我们最好以类图的方式来说明这个代理的机制,如图所示:

 

 

    到这里如果还觉得抽象,没关系接下来我以更加贴切的实例来结合类图的方式给出对应的参照说明。假如我们把上面的proxy模式再做个深入的探讨剖析(结合上面说的客户端发送参数作为请求和提出的问题综述)。大家都知道一个接口是能够在安全甚至在扩展上能够帮助我们非常大的功能。作为客户端最为希望的就是只关心我们需要的参数(或者变量)、返回值,而它如何而来,做了哪些具体工作这些都不是客户端关心的。Ok,现在结合我们说的接口方式,确实可以解决这个问题(接口的简单化,没有具体实现),但是你可能会问:

1.      既然接口如此简单,那参数又是如何传递过去的呢?

2.      服务端又如何知道我要的是什么呢?

带着问题我们来解决这个问题,当然也是大家所关心的问题了。现在开始要对于上面的proxy模式做个深入剖析了。我们先来看一个proxy模式演变的过程的图示:

 

图:RMI核心结构

    我们可以从图示看出从传统的proxy模式变化到一个变化的结构有什么不同呢?对于先前我们提出的两个问题就可以很好的做出解释了:

n         既然接口如此简单,那参数又是如何传递过去的呢?

A:既然是对客户端只开接口暴露,那么我们是就需要一个后台的socket来传输接口中已经定义好的参数,通过参数的编组(序列化)方式请求到远程服务上去响应处理。这当中要求定义到对方服务的服务名称和端口号。(这里也就是我们最先提到的那段代码了)

n         服务端又如何知道我要的是什么呢?

A:ok,既然客户端是通过socket来发送数据,那势必一定需要ServerSocket来做这个响应的接收处理了。问题是传过来的参数如何与我们的业务实现类关联上呢?所以这个也就是skeleton的职责所在了,在skeleton的封装处理中(启动中就把响应实现类给嵌入,聚合实现类),然后通过类转换处理和匹配处理来得到需要响应的结果了。

   

    本来说到这想大概有个收尾,但是总觉得还没有把一些问题说透彻。索性想再深入写写。
    从套接字衍生到RMI代码思路

分享到:
评论

相关推荐

    Rmi示例 Rmi代码示例

    RMI(Remote Method Invocation,远程方法调用)是Java平台中的一个重要特性,它允许Java对象在不同的Java虚拟机之间进行通信,实现分布式计算。RMI是Java开发分布式应用程序的基础,尤其在构建分布式服务和微服务...

    java_rmi.rar_RMI java_java.rmi

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

    java rmi java rmi

    根据提供的文件信息,我们可以深入探讨Java RMI(Java Remote Method Invocation)的相关知识点,包括其概念、原理、体系结构以及一个具体的示例。 ### RMI的概念 RMI是一种Java技术,它允许开发者创建分布式应用...

    RMI.rar_Java RMI_java.rmi_java.rmi.Remot_remote

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

    java rmi 参考文档

    ### Java RMI (Remote Method Invocation) 概念与实践 #### 一、Java RMI简介 Java RMI(Remote Method Invocation)是一种允许调用不同Java虚拟机(JVM)上方法的机制。这些JVM可能位于不同的机器上,也可能在同一...

    Synaptics_RMI3_Specification.zip_RMI3_Synaptics_rmi4_s3508 _spec

    《Synaptics RMI3 触摸芯片编程详解——基于S3508》 Synaptics公司作为全球领先的触控解决方案供应商,其RMI(Remote Input Interface)系列芯片在业界有着广泛的应用。RMI3是Synaptics推出的一种新型接口,而S3508...

    JAVA RMI测试代码

    Java Remote Method Invocation (RMI) 是Java平台提供的一种分布式计算技术,它允许Java对象在不同的网络环境中进行交互,实现远程方法调用。本压缩包文件"rmi-code"包含了一个完整的RMI测试代码示例,适合在Linux和...

    java RMI实现代码

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

    SpringRMI小例子

    Spring Remote Method Invocation(RMI)是Java平台上的一个远程对象调用框架,它允许一个Java对象在一台机器上执行,并且被另一台机器上的客户端调用。在这个"SpringRMI小例子"中,我们将深入探讨如何利用Spring...

    JAVA RMI 传输 SSL加密

    Java RMI (Remote Method Invocation) 是一种用于在Java应用程序之间进行远程通信的技术。为了提高RMI通信的安全性,我们可以使用SSL (Secure Sockets Layer) 或其后继者TLS (Transport Layer Security) 进行加密。...

    spring中使用RMI

    在Spring框架中,远程方法调用(Remote Method Invocation, RMI)是一种使应用程序能够通过网络调用另一个JVM上的对象方法的技术。RMI是Java平台的一部分,它允许开发者创建分布式应用,使得对象可以像调用本地方法...

    RMI原理及应用详解

    **RMI原理及应用详解** 远程方法调用(Remote Method Invocation,简称RMI)是Java平台提供的一种分布式计算技术,允许在不同的Java虚拟机(JVM)之间进行对象方法的透明调用。RMI的核心思想是使Java对象能够跨越...

    spring RMI简单例子

    Spring RMI(Remote Method Invocation)是Java平台上的远程方法调用技术,结合Spring框架的特性,使得在分布式系统中调用远程服务变得更加便捷。在这个简单的例子中,我们将深入理解Spring RMI的工作原理以及如何...

    分布式实验报告RMI.docx

    分布式实验报告 RMI.docx 本实验报告主要介绍了 Java RMI(Remote Method Invocation,远程方法调用)的基本概念和实现步骤。RMI 是一种分布式对象通讯机制,允许运行在一个 Java 虚拟机的对象调用运行在另一个 ...

    Ehcache RMI Replicated Cluster(RMI集群)

    Ehcache RMI Replicated Cluster 是一种分布式缓存解决方案,它使用远程方法调用(RMI)技术在多个节点之间复制数据,以实现高可用性和负载均衡。在大型分布式系统中,缓存是提高应用程序性能的关键组件,因为它可以...

    java_rmi文档

    Java RMI(Remote Method Invocation,远程方法调用)是Java平台提供的一种分布式计算技术,它允许在不同的Java虚拟机之间进行方法调用,仿佛这些对象都在同一台机器上。RMI是Java网络编程的重要组成部分,使得开发...

    基于JAVA RMI的聊天室

    **基于JAVA RMI的聊天室** Java Remote Method Invocation(RMI)是Java平台提供的一种用于在分布式环境中调用远程对象的方法。在这个“基于JAVA RMI的聊天室”项目中,开发者利用RMI技术构建了一个简单的多用户...

    rmi_java项目实例

    本项目实例是基于RMI技术实现的一个服务器端程序,名为"RMIServer",提供了远程服务的接口和实现,下面将详细介绍RMI的基本概念、工作原理以及如何通过这个项目实例来学习和应用RMI。 1. **RMI基本概念**: - **...

    RMI

    **远程方法调用(Remote Method Invocation,RMI)** RMI是Java平台中用于实现分布式计算的一种机制。它允许一个Java对象在某台计算机上执行方法,而该方法的调用者位于另一台计算机上。这使得开发者可以构建分布式...

Global site tag (gtag.js) - Google Analytics