大家都知道对于互联网的世界网络通讯是其本质特征。而对于一个分布式式计算来说更是如此。在它的环境中使用了客户/服务器结构特点,使用的一个核心技术就是网络通讯层。在最早的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代码思路
分享到:
相关推荐
1、文件内容:spice-glib-devel-0.35-5.el7_9.1.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/spice-glib-devel-0.35-5.el7_9.1.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
perl516-perl-Locale-Maketext-Simple-0.21-19.el6.centos.alt.noarch.rpm
康威生命游戏,简单的规则到复杂的稳定
基于参考性的单部六层与六部十层(涵盖1200系列与1500系列仿真)的技术特性分析,单部六层(1200系列、1500系列都有可仿真 ),六部十层1200系列。 有较大参考性。 ,核心关键词:单部六层仿真; 1200系列; 1500系列; 六部十层; 较大参考性。,"六层与十层仿真对比:1200系列与六部1500系列深度解析"
perl516-perl-FCGI-0.74-3.el6.centos.alt.x86_64.rpm
1、文件内容:syslinux-devel-4.05-15.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/syslinux-devel-4.05-15.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
1、文件内容:selinux-policy-sandbox-3.13.1-268.el7_9.2.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/selinux-policy-sandbox-3.13.1-268.el7_9.2.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
反激式开关电源设计方案:高效稳定输出12V 6A,全套原理图与工程文件,BOM表齐全,即建即用,反激式开关电源设计方案,12V6A输出,有完整原理图,PCB工程文件,BOM表,可直接使用。 ,反激式开关电源设计方案; 12V6A输出; 完整原理图; PCB工程文件; BOM表; 可直接使用。,反激式电源设计,12V6A高效输出,完整文件及原理图供现成使用
## 功能特点 1. 数据导入 - 支持Excel文件 - 支持CSV文件 - 数据预览 - 自动识别列 2. 图表类型 - 折线图 - 柱状图 - 饼图 - 散点图 - 箱线图 - 热力图 3. 图表设置 - 自定义标题 - 主题选择 - 轴标签设置 - 样式调整 4. 其他功能 - 实时预览 - 高清导出 - 多种格式 - 简单操作
perl516-perl-Archive-Tar-1.96-1.el6.centos.alt.noarch.rpm
github官网
1、文件内容:sssd-tools-1.16.5-10.el7_9.16.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/sssd-tools-1.16.5-10.el7_9.16.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
vscode 结合目前图书购物网站的设计方案,本项目在设计时应该满足以下特点。界面设计美观大方、操作简单。功能完善、结构清晰。能够实现前台新书上架功能。能够实现前台新书分类功能。能够实现前台购物车功能。能够实现后台用户管理。能够实现后台订单管理。能够实现后台图书管理。
数据集格式:VOC格式+YOLO格式 压缩包内含:3个文件夹,分别存储图片、xml、txt文件 JPEGImages文件夹中jpg图片总计:1717 Annotations文件夹中xml文件总计:1717 labels文件夹中txt文件总计:1717 标签种类数:7 标签名称:["chuanru","cuokou","duiji","laji","liefeng","nitu","shugen"] 中文对照:穿入、错口、堆积、垃圾、裂缝、泥土、树根 每个标签的框数(注意yolo格式类别顺序不和这个对应,而以labels文件夹classes.txt为准): chuanru 框数 = 328 cuokou 框数 = 200 duiji 框数 = 884 laji 框数 = 610 liefeng 框数 = 836 nitu 框数 = 187 shugen 框数 = 356 总框数:3401 图片清晰度(分辨率:像素):清晰 图片是否增强:否 标签形状:矩形框,用于目标检测识别 重要说明:暂无 特别声明:本数据集不对训练的模型或者权重文件精度作任何保证,数据集只提供准确且合理标注
ollama Ollama 解释 转变 AI 可访问性和语言处理
e2studio开发RA2E1(5)----GPIO输入检测 CSDN文字教程:https://coremaker.blog.csdn.net/article/details/145431876 B站教学视频:https://www.bilibili.com/video/BV1oxPReEEUW/ 本篇文章主要介绍如何使用e2studio对瑞萨单片机进行GPIO输入检测。 首先需要准备一个开发板,这里我准备的是自己绘制的开发板,需要的可以进行申请。 主控为R7FA2E1A72DFL#AA0
基于PLC技术的全自动洗衣机多功能控制系统设计与实现,基于S7-200 PLC组态王组态和触摸屏的洗衣机控制系统的设计 熟悉工业电气控制系统的组成,熟悉PLC系统的设计。 全自动洗衣机能够根据衣物的质地、数量及脏污程度 来实现标准洗涤、柔顺洗涤等多功能模式。 各个功能 模式均包括洗涤、漂洗、排水、脱水等过程,各个 过程的时间设定都与不同模式有关,并且同时能够分 过程单独执行。 编制系统梯形图控制程序,利用组态 王软件进行仿真或作出实物。 重点问题:PLC的选型,如何判断模式的自动选择, 如何判断衣服的数量和脏污程度。 摘要I ABSTRACTII 1 引言- 1 - 1.1设计目的和意义- 1 - 1.2主要设计内容- 1 - 2 总体设计- 2 - 2.1设计要求- 2 - 2.2方案设计- 2 - 3 硬件设计- 4 - 3.1 PLC选择- 4 - 3.2 主电路设计- 4 - 3.3 控制电路设计- 5 - 3.4 PLC输入和输出分配- 6 - 3.5 PLC输入和输出接线图- 7 - 4 软件设计- 9 - 4.1 控制流程图- 9 - 4.2 PLC内部使用地址- 10
西门子S7-1200 PID温度控制程序(博图V15高级版)——适用于模具加热工艺,稳定工作,可二次开发与扩展,西门子S7-1200 PID温度控制程序,PID参数经过预调节和精确调节之后得出,程序采用博图V15高级版编写,适合用于不带冷却功能的模具加热生产工艺上,项目上运用已稳定工作多时,带详细注释,可进行二次开发和扩展,也可直接使用 本程序采用博图V15编写,需要博图版本高于V15,版本低于V15的,请先升级至博图V15 ,西门子S7-1200; PID温度控制程序; 预调节和精确调节; 博图V15高级版; 模具加热生产; 稳定工作; 详细注释; 二次开发; 扩展; 版本升级,“西门子S7-1200 PID温控程序,稳定应用于无冷源模具加热工艺”
perl516-perl-Version-Requirements-0.101022-100.el6.centos.alt.noarch.rpm
百度API集成下的ASP.NET点餐系统项目:三层架构实现,管理员后台与商家前台功能完备,asp.net的点餐系统项目,才答辩完,可以使用。 使用了百度API,也是三层架构,有管理员后台和商家前台 ,asp.net点餐系统项目; 百度API; 三层架构; 管理员后台; 商家前台,"基于ASP.NET的三层架构点餐系统项目,整合百度API,答辩后可用"