lce的回调实现(Bidirectional Connections)双向通信

在实际的过程中,ICE客户端跟服务端的数据流动是单项的,也就是客户端获取服务端的一个代理,从而与服务端进行数据交互,如果服务端要主动给客户端数据的时候,则需要我们给服务端传去一个客户端的代理。这时客户端也是一个服务器。在ICE中客户端、服务端没有严格的限制。
为了实现回调,同时又要使得客户端和服务端有严格的限制,ICE主要提供了三种方法
(1)客户端通过server端接口传送个server回调的proxy.这种情况适合服务器、客户端在如下的环境。客户和服务器程序或者运行在同一个主机上,或者运行在没有网络限制的多个主机上。这样的环境下,提供回调是最简单的。
(2)使用Glacier2 router,自己未接触过。
(3)由于第一种方法,有时候在网络复杂的情况,传送回调代理的时候会出现失败,因此下面主要介绍Bidirectional Connections双向通信方法。

1、需求

使用ice 进行client和server之间的通信,请求(request)往往是单向的,即client请求server。然而这种情况有时候不能满足我们的项目设计需求,需要server向客户端进行回调。这种情况下server端通常向client建立一个新的链接。如下图所示:

这里写图片描述

不幸运的是,有时候收到网络限制,客户端与服务端之间间隔这防火墙,防火墙阻止服务端向客户端主动建立连接,如下图:

这里写图片描述
这种情况下,防火墙阻止了服务端发起的任何链接。
面对这种情况,ICE提供的双向连接提供了一种解决办法,服务端的回调请求和客户端的request都可以通过一条双向通信的链接。也就是服务端的回调请求可以通过客户端已经存在的链接传输。
有两种方法来使用Bidirectional Connections。第一种方法,使用Glacier2 router, 在这种方式下,自动使用Bidirectional Connections,如果不想使用glacier2提供的这功能,可以使用第二钟方法;第二种,通过代码形式人工配置Bidirectional Connections。
声明—-我没使用过第一种方法,也不知道具体的意思,好囧(哈哈),最近在看代码,下面主要介绍第二种方法。

2、配置client端,进行Bidirectional Connections
为了配置Bidirectional Connections,需要在客户端配置如下几步:
(1)创建一个object adapter,来接收服务端的回调请求,这个adapter不需要名称或者endpoints,他的作用仅仅是接收服务端的回调请求
(2)使用这个adapter注册一个回调对象(object)
(3)激活这个object adapter
(4)在client向server端已经建立的代理(proxy)上调用ice_getConnection()函数,这样获得一个连接对象(connection object)
(5)在connection object 上调用setAdapter(adapter),传递第一步创建的adapter。这样将adapter和connection联系起来,server端就可以进行回调请求。
(6)传输回调对象的identity给server
下面是代码示例(python版):

class Client(Ice.Application):
    def run(self, args):
        if len(args) > 1:
            print(self.appName() + ": too many arguments")
            return 1

        server = Demo.CallbackSenderPrx.checkedCast(self.communicator().propertyToProxy('CallbackSender.Proxy'))
        if not server:
            print(self.appName() + 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值