假设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再封装下,定义一点传输头部以实现上面功能也没什么,作为库的一个标准形式。大家都关心的是无脑使用方便,学习成本低,开箱即用。
这种方式,要么对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模型一样。
登录 后才可以发表评论