126 Star 538 Fork 295

夏楚 / ZLToolKit

 / 详情

tcp client能否支持rpc式接口,这样才上层方便友好

已完成
创建于  
2019-05-19 11:00

假设tcp client和server已经定义好了协议,并且实现了。对于client使用来说:
一、主动的一般是发出一个request,然后等待server response,这里最好是两种调用形式比较好:
(1). response syncCall(request, timeout); //同步阻塞请求,等待timeout时间
(2). void asyncCall(request, timeout,responseCb); //异步请求,responseCb可以是个lambda函数嘛
最麻烦的方式,肯定是这边send,那边一个recv callback,参数状态等传来传去真是太麻烦了,客户端调用可能还涉及UI绘制等。这种友好的形式可以参考okhttp的调用方式。
二、被动的还是需要一个onRecv Callback,就纯粹是服务端主动推送过来,客户端需要处理的消息。

一般的网络库,大家都关注的是服务端,高性能等等,C++相关的库或者Java Netty挺多的。都没太关注客户端的调用友好这点,既需要使用TCP双向通信,有业务的主动调用方法,也有被动推送通知功能,另外天然就是私有协议。
建议再基于TcpClient再封装下,定义一点传输头部以实现上面功能也没什么,作为库的一个标准形式。大家都关心的是无脑使用方便,学习成本低,开箱即用。

评论 (4)

leopard 创建了任务

这种方式,要么对tcp client的收发进行大改,要么是传输头部加一个标识,服务端要配套把标识传回来。
为了可推广性,建议服务端提供头部定义形式,主攻TCP客户端真正易用,现在的封装只是技术易用,离业务开发还差段距离,每个人拿着都还要再实现一套自己的,为什么你不弄一个标准的形式,只要方便好用,说不定都会用你的标准形式了。

同步等待接收这种形式会破坏整个库的设计原则,如果用户在事件循环线程中同步等待,会导致后面所有的串行任务阻塞,这样做很危险,会导致其他异步接口都无法使用,这样相当于引导用户去做错误的事情。
开发者应该按照一定的使用原则来使用某个框架,比如说android系统强制规定不得在后台线程执行刷新UI控件的操作、UI线程不得操作网络相关接口,这些操作都是强制性禁止的。
ZLToolKit也有强制性的要求,比如说不得在事件循环线程执行耗时的操作,这个是无法兼容的,必须遵循这一规则。
而同步等待接口很可能让用户破坏这一规则,所以为了避免错误的引导用户,暂时不考虑同步等待这样的接口。
其实处处无阻塞、处处回调的编程方式,习惯了还好,不是那么不适应的,ZLMediaKit作为基于ZLToolKit的协议库,已经实现了很多类型的TCP客户端,代码可读性也并不是那么差。
现在C++11对异步编程支持还是挺友好的,不像libuv那样不太好理解

夏楚 任务状态待办的 修改为已完成

(1). response syncCall(request, timeout); //同步阻塞请求,等待timeout时间
这个接口是send和recv的高级包装,目的是更易用,跟在事件循环中执行耗时操作是两码事啊。

其实我觉得一个优秀的网络框架,应该杜绝在事件循环中做阻塞式操作,也应该杜绝跨线程操作这个socekt相关的对象,在底层判断操作的对象io的是否是绑定的事件循环线程,如果发现不是就抛异常。要强制性的要求开发者养成一个对象一个线程的开发模型,就像Android的UI模型一样。

登录 后才可以发表评论

状态
负责人
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
参与者(2)
C++
1
https://gitee.com/xia-chu/ZLToolKit.git
git@gitee.com:xia-chu/ZLToolKit.git
xia-chu
ZLToolKit
ZLToolKit

搜索帮助