目录
0.学习及脚本链接
1.源码路径及可执行程序路径,命令及脚本
/home/muten/module/TARS/TarsFramework/tarscpp/examples/PushDemo/PushServer
/home/muten/module/TARS/TarsFramework/tarscpp/examples/PushDemo/PushClient
/home/muten/module/TARS/TarsFramework/build/bin/PushServer
/home/muten/module/TARS/TarsFramework/build/bin/PushClient
ps -ef | grep PushServer
/script/startPushServer.sh
2.环境与背景
在实际的应用场景中,需要在TARS服务框架中支持其他服务端到客户端的push模式具体程序示例,参见源码中的examples/PushDemo/.
3.push模式示意图
黑色实体箭头代表了一般情况下的数据流向:
(1)数据(客户端);
(2)请求包的编码器(客户端);
(3)协议解析器(服务端);
(4)doRequest协议处理器(服务端);
(5)生成返回数据(服务端);
(6)响应包的解码器(客户端);
(7)响应数据(客户端).
其中请求包的编码器(客户端)负责对客户端发送的数据进行打包编码,协议解析器(服务端)负责对收到的数
据进行解包并交给协议处理器(服务端)去处理并生成返回数据,而响应包的解码器(客户端)负责对返回的数
据进行解码.
PUSH模式下:
淡水红色的箭头代表客户端访问服务端;
tiffany蓝的箭头代表服务端向客户端push消息;
4.Tars中实现服务端到客户端的push模式
4.1 服务器端
对于服务端,首先服务端需要按照开发第三方协议的模式(即非tars协议),实现协议包的解析器,并将
其加载到服务中,同时需要建立一个非TARS框架的服务对象,该类继续继承TARS框架的Servant类,通过
重载Servant类中的doRequest方法建立客户端和服务端之间的协议处理器,同时在该方法中保存连接到服
务端的客户信息,以便服务端向客户端push消息,另外需要重载Servant类中的doClose方法,在服务器得
知客户关闭连接后,释放doRequest方法中保存的客户信息,这样就可以不需要对该客户进行push消息。
另外,服务端需要建立一个专门用于向客户端push消息的线程。
4.2 客户端
对应客户端,首先要按照第三方协议的模式,实现协议包的编解码函数,并将其设置到相应的ServantProxy
代理的协议解析器中,通过ServantProxy类tars_set_protocol方法实现;然后需要自定义一个回调类,该
类继承ServantProxyCallback类,(因为服务端push消息给客户端时,客户端收到消息是异步的,所以客
户端对消息的处理以异步方法进行),同时需要重载其中的onDispatch方法,在该方法中,对客户端和服务
端之间定义的协议进行解析处理;最后需要new一个上面自定义的回调类,然后将其作为参数传入
ServantProxy的tars_set_push_callback方法中.另外,客户端需要定期的发送消息给服务端(相当于心跳
包),以便告诉服务端,客户端是存活的(因为服务端在一定时间内没收到来自客户端的消息,会自动关闭其
之间的连接).另外,在服务端与客户端push模式交互之前,客户端要访问服务,需要通过调用ServantProxy
类的rpc相关函数。
5.代码实现
https://github.com/TarsCloud/TarsCpp/tree/master/examples/PushDemo
或者
TarsdocGitHub在线文档-----------建议使用这个代码,做适当的修改即可(改IP和端口即可)