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

文档序号:9527599阅读:来源:国知局
并将其中作为引用传 输的参数用相应的远程对象代替;远程端继续按照正常的过程执行来自本地端的方法调 用;
[0106] 步骤f:远程端完成方法调用之后,搜集结果并判断结果是否为远程对象;如果 是,执行步骤g;否则,执行步骤h;
[0107] 步骤g:远程端将此结果发布为远程对象;
[0108] 步骤h:将此结果打包为结果对象,设置好与请求对象对于的编号,发送到客户 端。
[0109] 采用远程对象的方式来表示对一个对象的引用,结果是需要以引用传输的地方, 就会传输过去相应的远程对象,最终在引用上的操作,都会通过这一套远程对象方法调用 机制重新作用在原对象上。
[0110] 所述步骤1中远程端作为连接的接收者在连接之前已经处在监听状态。远程端处 于监听状态,等待连接请求,保证本地端发送请求,远程端就能及时接收。
[0111] 所述步骤11中连接一旦关闭,该连接对象上将不能再传输任何信息,在它上面做 的任何读写操作都将抛出异常,该异常将会沿着序列化组件对象传递给上层的使用者。
[0112] 所述本地端以UTF8编码的方式将字符串发送到远程端;远程端以UTF8编码的方 式读取字符串,提取其中每一个元素。
[0113] 如图4所示,为本发明具体实施例1所述的一种基于长连接的双向调用系统,包括 连接请求模块1、连接建立模块2、方法调用模块3、远程完成模块4和本地恢复模块5 ;
[0114] 所述连接请求模块1用于本地端作为连接的发起者,多个远程端作为连接的接收 者,本地端分别发起连接请求到多个远程端;
[0115] 所述连接建立模块2用于控制每个远程端接收一个连接请求,本地端和每个远程 端都相应的获得一个进行传输字节流的连接对象,本地端和远程端建立连接;本地端与远 程端协商确定一个序列化协议,并使用该协议包装字节流连接,从而提供一个对象传输的 通道;
[0116] 所述方法调用模块3用于远程端将序列化的连接对象发送到本地端,本地端执行 通信线程,通信线程内包含栈,当通信线程执行本地代码,通信线程内栈的栈定节点成为活 跃节点;所述方法调用模块用于调用远程方法,通信线程执行远程代码,远程端出现远程通 信线程,活跃节点转移到远程端,本地端进入暂停状态;
[0117] 所述远程完成模块4用于远程通信线程执行完毕,远程通信线程结束,活跃节点 从远程端转移到本地端;
[0118] 所述本地恢复模块5用于本地端恢复获得活跃节点,判断当前通信是否完成,如 果是,关闭连接,清除无效连接对象;否则,远程端调用远程方法。
[0119] 所述方法调用模块3中的调用远程方法采用传引用系统,如图5所示,所述传引用 系统包括调用模块6、判断模块7、对象封装模块8、解析模块9、调用判断模块10和结果模 块11 ;
[0120] 所述调用模块6用于本地端在发起对远程端的远程过程调用时,先在本地端检查 方法中的所有参数;
[0121] 所述判断模块7用于判断参数中是否包括引用对象,如果是,本地端将此参数发 布为远程对象;否则,直接触发对象封装模块;
[0122] 所述对象封装模块8用于将此调用封装为请求对象和响应对象,并发送到远程端 进行处理;
[0123] 所述解析模块9用于远程端接收到请求对象并解析,扫描远程引用参数,并将其 中作为引用传输的参数用相应的远程对象代替;远程端继续按照正常的过程执行来自本地 端的方法调用;
[0124] 所述调用判断模块10用于远程端完成方法调用之后,搜集结果并判断结果是否 为对象;如果是,远程端将此结果发布为远程对象;否则,触发结果模块;
[0125] 所述结果模块11用于将此结果打包为结果对象,设置好与请求对象对于的编号, 发送到客户端。
[0126] 以下实施例以客户端作为本地端,服务器端作为远程端。
[0127] 该基于长连接的双向过程调用机制是基于接口的。客户端和服务器端使用同一套 接口,服务器端可以先发布一些远程对象供客户端调用其方法。
[0128] 在本发明所述方法中,远程对象分为全局远程对象和局部远程对象。在传统的远 程对象中,对象的识别方式为URI,即每个远程对象将对应一个URI。URI可以认为是网络环 境中一个对象名字,也可以认为是网络环境中的全局对象。而在该RPC机制中,还支持局部 对象的概念。局部对象生命周期较短,命名也较全局对象随意。对于局部对象的支持,是 靠本机制中"传引用"功能所实现的。
[0129] 传引用的目的在于让对获得的对象的操作都在原对象身上生效。而获得的对象, 即远程对象,也就是远程引用了。传引用,就是将参数或者返回值中的对象也做成远程对 象,并提供给远程使用。
[0130] 在Java语言中,并没有特别的用一些标识来区分在函数参数是传值还是传引用。 而在VisualBasic、C++等都有"ByRef"、"&"等标识来特别地区分出传引用。在本系统中, 使用"OByRef"标识来区分传引用,从而使得另一端对该引用对象的调用访问会反馈到原对 象中。如此,也能实现局部对象发布,供另一端访问。
[0131] 在传引用中,采用远程对象的方式来表示对一个对象的引用,结果是需要以引用 传输的地方,就会传输过去相应的远程对象,最终在引用上的操作,都会通过这一套远程对 象方法调用机制重新作用在原对象上。传引用的具体步骤如下:
[0132] 1)即客户端在方法调用之前,检查方法中的参数,将需要以引用方式(带有@ ByRef注解)传输的对象发布为远程对象;
[0133] 2)进入正常的远程调用途径,将方法调用请求发送到远程服务器端;
[0134] 3)服务器端接收到方法调用请求时,扫描所有的参数,并将其中作为引用传输的 参数用相应的远程对象代替;
[0135] 4)而后执行方法调用过程;
[0136] 5)方法调用完成之后,搜集结果并判断结果是否需要以引用的方式传递。如果需 要,则执行与客户端相同的对象的发布过程,然后返回;
[0137] 6)客户端接收到结果之后,根据是否为引用解析相应的结果,并返回给用户。
[0138] 针对不同的远程对象,他们有不同的生命周期。远程对象分为两类:一类是全局 型的远程对象;另一类是局部型的远程对象。全局型的远程对象开始于将对象与一个名字 绑定。最后当某些条件(比如系统关机)达成时,此对象与相应的名字解绑定,其生命周期 结束。而对于局部对象,他是源自于过程调用的参数,此时源端的对象自动成为一个远程对 象被交互的另一端使用。当另一端不再需要使用该远程对象时,则此局部远程对象的生命 周期结束。
[0139] 当对象生命周期结束时,有两件事情需要做:1)通知可能依赖于目标对象的过 程,该对象生命周期结束的事件;2)清除该对象作为远程对象存在时留下的各种残留。
[0140] 向对该对象存在依赖的对象通知该事件,本系统采用了事件机制,即当某个过程 依赖于该对象,并且希望获知该事件的对象可以通过设置这一个监听关系就能在事件发生 时得到相应的事件通知。
[0141] 而当一个对象生命周期结束时,系统中可能存在的残留包括:远程主机对该对象 的引用、该对象上未完成的方法调用等。当检测到一个对象生命周期结束时(比如通过检 测GC的对象回收过程),通过某种方式获取到相应的标识符,然后通知远程主机该对象已 经无效的事件。远程主机上收到该消息之后,也作相应的处理。
[0142] 针对系统残留处理,这里采用心跳包的方式解决问题。即两台主机都定时检查本 机上的远程对象,并向远程查询相应的对象的存在性。当任何一端确定某对象已经不存在, 那么该对象就已经可以清除了。因为只在一端存在的远程对象,实现不了通信,从而也就失 去了远程对象的意义。使用这种心跳机制,如果存在某个对象因为某种原因,在一端清除了 而另一段没有的情况下,下一次的查询过程就必定能够重新获取"该对象已失效"的信息, 从而可以重新启动他的清除过程,保证无效对象的成功清除。
[0143] 下面参照附图并结合实施例对本发明进行详细的描述。
[0144] 本发明其步骤包括:
[0145] a)该双向调用的远程对象服务机制由连接建立、远程调用、对象善后处理等组 成;
[0146] b)连接建立说明了远程服务建立的过程。客户端和服务器端之间的通信过程要将 对象进行序列化,再进行传输。在建立连接之前,客户端和服务器端之间要进行握手,将所 支持的序
当前第3页1 2 3 4 5 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1