一种基于长连接的双向调用方法及系统的制作方法_4

文档序号:9527599阅读:来源:国知局
列化协议进行比对,最终确定客户端和服务器端都支持的一种协议作为序列化协 议;
[0147] c)远程过程调用说明了双向远程对象服务的建立。服务器端会发布远程对象,供 客户端进行远程调用。客户端在调用时,会包装和发送请求对象给服务器端,如果调用参数 包括局部对象,则也会将此对象发布为远程对象。服务器端会解析请求对象,并执行调用过 程,其中也可能会涉及到对客户端的远程对象的反向调用。服务器端搜集调用结果,封装为 结果对象返回给客户端;
[0148] d)当调用过程正常结束后,连接断开时,要涉及到远程对象的善后处理。主要通过 Java的GC机制等对远程对象进行清理。
[0149] 使用双向连接,使得客户端不受局域网的限制,也可以发布远程对象服务,供服务 器端进行调用。当然,客户端和服务器都在广域网中,或是都在局域网中,也可以使用双向 连接的特性;
[0150] 客户端向服务器端发起的远程过程调用的请求对象中,如果含有特定对象,则需 要发布为远程对象。这样服务器可以获得有状态的客户端对象,其对此对象的操作会反馈 会客户端。
[0151] 服务器端的调用结果如果是一个对象,则会再度发布为一个远程对象,将其引用 封装为结果对象传回客户端。客户端可以进行解析结果对象,获得调用结果。
[0152] 客户端和服务器端上的远程对象如果没有被引用了,则会由Java的GC回收机制 来清理这些远程对象。当一个对象生命周期结束了,系统中可能存在的残留包括:远程主机 对此对象的引用、此对象上未完成的方法调用等。系统检查到本地一个对象结束后,则会通 知远程主机该对象已经无效,从而也对这些残留对象进行处理。
[0153] 连接建立过程:
[0154] 在本系统中,在客户端和服务器端进行连接和通信的时候,将这一过程分为了两 部分:1)对象序列化部分;2)数据传输部分。其中,对象序列号部分的角色就是一个适配 器,而且它就是最终被外部使用的对象。在进行远程过程调用的过程中,在传输参数的过程 中,对象被序列化,这样就能通过网络传输了。
[0155] -个连接的建立,存在两个角色,连接的发起者和连接的接受者。连接的接受者需 要在建立连接之前就已经处于监听状态,等候连接的请求。而后连接发起者发起一个连接, 接受者接受该连接请求,两端都相应地获得一个能传输字节流的连接对象。
[0156] 连接握手期:
[0157] 这一个阶段的作用是确定通信双方使用的序列化协议,并加载上响应序列化组件 实例。
[0158] 首先是连接的发起端,查询本机所支持的序列化协议,并将这些协议的名字按照 最期望使用到最不期望使用的顺序排成一个序列。而后将该序列表示成元素逗号分隔得字 符串,并以UTF8编码的方式(这一个时期内,后面的字符串传输都采用这种方式)将该字 符串(后带一个回车换行符〈CRXLF〉)通过上一步中获得的字节流连接发送给远程;而后 进入读取状态,等待对方发送回来的结果。
[0159]连接的接收端则以UTF8的方式从第一步获得的流中读取一行(到回车换行符〈CRXLF〉结束),而后将改行以逗号分隔的方式,取出其中的每一个元素;而后依次检查 这每一个元素本机是否支持,直到找到第一个支持的为止。如果找到了支持的,则发回连 接的发起端一个字符串"ACCEPTED:〈SERIALIZATI0N_PR0T0C0L_NAME>",如果没有找到支持 的,就往回发送"DENIED"字符串,两种方式都以回车换行符〈CRXLF〉结尾。如果有找到支 持的协议,意味着相应的连接是可以建立的,查找相应的序列化组件,并在该连接上构建他 的序列化组件实例。
[0160]连接发起端在接收端发送回来结果的时候。解析是否被远程接受,被接受的情况 下,所使用的序列化协议名字是什么,然后使用该协议在第一个时期获得的连接上创建一 个序列化组件实例。如果连接被拒绝则回收第一个时期获得的连接资源,并宣告连接失败。
[0161] 通信期:
[0162]在完成连接建立期和连接握手期之后,就可以得到一个可以传输对象的通信连接 了,用于进行方法调用中的数据包对象的传递。
[0163]假设远程进程中存在一个对象a,本机上通过某种途径获取了该对象的一个远程 引用a'。然后在a'上执行它所提供的某函数(假设为StringmethodOO),那么该函数的 执行过程将会在远程的对象a上发生。方法调用的具体过程如表1所示:
[0164]
[0165]
[0166] 表 1
[0167] 本系统支持双向的远程过程调用,S卩服务器端也可以去调用客户端发布的远程对 象。具体步骤见图6。
[0168] 这里描述的远程调用的过程中的两个线程(客户端调用该方法的线程和服务器 端为响应该方法调用而启动的新线程),各自都有一个"栈"结构,一个在本机一个在远程。 但是这两个"栈"中,只存在一个"活跃结点"。即,当线程还是在运行本机代码的时候,"活 跃结点"就是当前"栈"的"栈顶结点"。而当调用了远程方法,当前"栈"就进入了暂停状 态,所以不再具备"活跃结点";而此时远程会出现一个新的线程执行目标函数,该线程处于 活跃状态,所以获得了 "活跃结点"。当远程的函数执行完毕时,远程的线程消失,而本机的 线程恢复执行过程,所以本机的线程又重新获得了 "活跃结点"。所以这个过程可以认为是 "活跃结点"在本机和远程之间发生了转移。从这一角度看,远程过程调用就非常像本地方 法调用,只不过发生了调用栈的转移。具体如图7所示。
[0169] 在对远程过程调用过程中,会涉及到很多的引用类型的对象作为参数。源端会传 输给另一端相应的远程对象,最终另一端在引用对象上的操作,都会通过这一套远程对象 方法调用机制重新作用在原对象上。如图8所示,带有引用对象作为参数的远程过程调用 步骤为:
[0170] 1)客户端在发起对服务器的远程过程调用时,先在客户端检查方法中的所有参 数,如果有以"OByRef"作为注解的对象,则将此对象发布为远程对象;
[0171] 2)客户端通过网络连接将方法调用请求发送到远程服务器端;
[0172] 3)服务器端接收到方法调用请求时,扫描所有的参数,并将其中作为引用传输的 参数用相应的远程对象代替;
[0173] 4)服务器端继续按照正常的过程执行该来自客户端的方法调用;
[0174] 5)服务器端完成方法调用之后,从本机搜集结果并判断是否需要引用的方式传递 会客户端。如果结果只是一个数据,则直接返回即可。如果结果是一个引用对象,则也同样 需要将此对象发布,然后远程引用传回给客户端。
[0175] 6)客户端收到来自服务器的结果之后,根据此结果的类型,而进行不同的解析过 程。如果是引用,则是将远程引用返回给用户,从而还可以进行对此对象的远程访问。
[0176] 结束期:
[0177] 当通信工作完成的时候,或者是不可恢复的通信异常(比如网络断了,串口松开 了)的时候,该通信的连接就会将进入断开阶段。
[0178] 进入连接断开阶段之后,序列化组件对象将向底层的连接对象发送一个关闭连接 的请求。连接对象收到该请求之后,将会把信息告诉远程的连接对象,而后关闭连接。连接 一旦关闭,该连接对象上将不能再传输任何信息,在它上面做的任何读写操作都将抛出异 常,该异常将会沿着序列化组件对象传递给上层的使用者。
[0179] 此时,也需要将远程对象进行善后处理。如图9所示,当一端的对象生命周期结 束时(比如通过检测GC的对象回收过程),通过某种方式获取到相应的标识符,然后通知远 程主机该对象已经无效,远程主机收到此消息后,也作相应的处理。
[0180] 如图10所示,本发明所述RPC组件的全部过程流程图具体步骤如下:
[0181] 步骤1 :服务器准备好进行监听;
[0182] 步骤2 :客户端发出连接请求,服务器接收,确定连接握手,确定双方通信序列化 协议,并在客户端和服务器上加载响应序列化组件实例;
[0183] 步骤3:服务器发表远程对象(例如:对象a);
[0184] 步骤4:客户端获得对应远程对象的远程引用对象(例如:对象a,);
[0185] 步骤5:客户端调用a,.method()方法,扫描参数;
[0186] 步骤6 :客户端判断参数中是否有引用对象,如果是,执行步骤7 ;否则,执行步骤 8 ;
[0187] 步骤7 :客户端将此参数发布为远程对
当前第4页1 2 3 4 5 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1