客户端网络库实现真的很简单吗?

(注:本文所讲的网络协议只针对TCP协议)

背景:开发一个C/S的应用势必需要服务端和客户端的适配,包括网络协议、数据传输格式、业务处理的适配。由于服务端承载着大量的客户端,需要高并发、高性能、高可靠性,在我们的认知里往往认为服务端的网络模型和架构设计很复杂。但是客户端嘛,无非就是建立网络连接,发个请求收个回复如此简单。所以在工作中经常会出现有些客户端处理界面和业务的同事对平台开发者说,你做好服务端的网络就好,客户端的网络我来处理,而且在他们的想法里,这个所谓的客户端网络库只需要很短的时间就可以做完,每每遇到这种情况,我都会问几个问题劝他们放弃这种想法,由更擅长进行网络编程的平台端来提供网络库,为什么呢?



先看看我常问的几个问题。

  1. 问:你打算怎样实现客户端的网络层?

    答:对于TCP协议来说无非就是connect,send,recv呗。

  2. 问:那你是否考虑到这种情况,你同时或者先后发过去两个网络请求,你怎么确定你收到回复是哪个请求的?

    (其实问到这时有些同事就开始不理解了,我会给他们解释网络传输和服务器处理不是串行的,往往会出现你后发的请求却先收到回复,客户端 多线程情况下更为常见。当然也有有办法的。)

    答:那我对每一个请求加一个唯一标识,这样我就可以分辨出来了。

  3. 问:你有没有考虑过由于connect,send,recv...这些系统API都是阻塞的,如果没有限制条件,会让你的一个请求卡住很长时间或者永远卡住?
  4. 问:你有没有考虑过短连接请求,长连接请求,服务端推送消息如何实现?
  5. 问:你有没有考虑过各种网络错误和异常的监控和处理,比如TCP长连接网络断开后的自动重连?
  6. 问:你有没有考虑过如果你把网络层或者网络数据层和前台业务和界面混杂在一起后的代码混乱复杂度?
  7. 问:你对TCP了解多少,仅仅是会用网络编程的API还是知道TCP还拥有一些诸如TIME_WAIT、TCP_NODELAY...的状态或特性,你知道经常说的粘包是怎么回事吗?

往往这些问题问出来一个或者几个之后一些人就会意识到凭他目前对网络编程的把控还不足以写一个生产级别的客户端网络库,其实我曾经也有过类似认为客户端网络库实现很sample的native的想法,但是当我配合着服务端用年计的时间逐渐在测试和生产环境中写出和完善出一个客户端网络库后才意识到它真的并不简单。

一切尽在不言中,程序员最好的交流语言就是代码,希望我的语言不至于很晦涩难懂。感兴趣的朋友可以参考我的github上的RPC_Framework这个项目参考一下我的网络库的写法,目前在公司生产环境中我已提供了linux平台、android平台、ios平台、windows平台的版本。github上的工程减少了一些功能,其中windows的版还未完全完成,希望大家能够提出宝贵的意见。

客户端网络库实现真的很简单吗?

时间: 2024-08-04 14:47:12

客户端网络库实现真的很简单吗?的相关文章

HTTP真的很简单(转)

原文:HTTP Made Really Easy因为我本身网络基础就很差,所以看到这篇文章一方面是学习网络知识,另一方面为了锻炼我蹩脚的英语水平,文中如有错误,欢迎浏览指正! 前言 在看这篇文章的时候,推荐使用chrome浏览器查看http请求过程中的相关参数.chrome浏览器,可以通过‘alt+cmd+i’进入开发者模式.进入‘Network’一栏,在‘Name’栏内找到请求的网址.查看Headers一栏,就可以看到‘Response Headers’和‘Request Headers’.并

王金战:改变一个差生真的很简单

当一个学生,反复遭遇失败的打击,他就变成了差生,没有一个学生生下来就注定是个差生.所以让一个差生变好真的很简单.    我刚参加工作的时候,不敢说这句话,但是我现在敢说,因为我多年的经历已经证明了这件事情.让一个差生变好真的很简单,怎么做呢?就是反其道而行之.差生是反复遭遇失败的打击后才产生的,让一个差生变好,就是让他反复享受到成功的喜悦,这个学生就会慢慢地变好了.    少年来我就用这样的方法和理念,帮着一个个学生走出困境,走向成功.我深深体会到,作为教师,作为家长,要学会欣赏孩子.特别是对那

怎么将pdf转换成word问题真的很简单

你还在寻找将pdf转换成word的方法吗?被网上眼花缭乱的步骤吓到了吗?你不会还在使用office word2003中的Microsoft Office Document Imaging组件来实现pdf转word工作吧.是不是太麻烦了呢?怎么将pdf转换成word问题真的很简单,不需要我们费脑筋,也不需要那么麻烦的操作,这里小编教你一个事半功倍的方法--使用迅捷pdf转换器将pdf转换成word. 经常进行文本格式转换操作的小伙伴们一定知道这款软件吧,不能再简单的操作步骤只需要三步即可完成pdf

Python写的网络爬虫程序(很简单)

Python写的网络爬虫程序(很简单) 这是我的一位同学传给我的一个小的网页爬虫程序,觉得挺有意思的,和大家分享一下.不过有一点需要注意,要用python2.3,如果用python3.4会有些问题出现. python程序如下: import re,urllib strTxt="" x=1 ff=open("wangzhi.txt","r") for line in ff.readlines(): f=open(str(x)+".txt&

方国治:做股票真的很简单,简单到

http://blog.sina.com.cn/s/blog_5ae207160102vrlb.html 方国治:做股票真的很简单,简单到 (2015-07-11 20:00:18) 转载▼ 标签: 股票 分类: 投资大道 2015年6月13日,由七禾网和混沌天成北京营业部共同举办的“2015金融巅峰论坛暨第二期混沌天成北京沙龙”活动在北京鸿坤国际大酒店香江厅举行.由善境投资总经理吴洪涛.深圳开拓者科技有限公司副总经理陈四建.<趋势操盘法则>畅销书作者方国治,以及上海奇获投资管理有限公司投资总

其实canvas真的很简单,复杂的部分其实是你的创意

江湖上流传开来的除了牛叉的"H5",还有牛叉的canvas应用. canvas是html5的一部分,当然他们说的H5也并不是html5的意思,只是表示在手机浏览器中,更侠义的是在微信浏览器中打开的酷炫的网页. 曾几何时,我也觉得canvas真的酷爆了,各种什么烟花.酷炫的动画效果.canvas游戏等,都燃烧着我学习的热情. 后来通过学习,多看书,其实canvas并不复杂,要用到的东西也不多. 大概整理一下: 1.绘制基本几何图形 (1)直线 ctx.moveTo(100,200); c

如果你这么去理解HashMap就会发现它真的很简单

Java中的HashMap相信大家都不陌生,也是大家编程时最常用的数据结构之一,各种面试题更是恨不得掘地三尺的去问HashMap.HashTable.ConcurrentHashMap,无论面试题多么刁钻的问,只要我们真正的掌握了它的设计思想,便可以不变应万变,hold住所有的面试题了. 本文主要包含以下内容,力求深入浅出一步一步彻底明白HashMap的设计思想: 数组的优势 数组是特殊的键值对 Hash函数 Hash冲突 此时再看HashMap源码 文章干货内容较多,建议大家“收藏”后持续阅读

字符串真的很简单

字符串在C语言中没有像整型.实型.字符型那样有自己的关键字,在其它机器语言中有字符串的关键字的,所以可以说字符串是C语言引用其它语言的.为了能够让C语言也用上字符串,所以用数组来存储字符串.其定义形式一般为char  变量名[数组长度],因为ASCII码表几乎包含常用的字符,所以一般定义为字符型数组(char),可以很好的节省内存占有量.其数组长度一般要比字符串个数大一,因为合格的字符串要求最后一个字符后面有'\0'的,只有这样才能正确使用使用字符串函数strlen.strcpy等.如果字符串长

i春秋-在线挑战-真的很简单-过程记录

0x00 下载运行dedeCMS.exe意见爆帐号密码 下载并运行dedeCMS.exe获取帐号和密码. 0x01 获取hash值对应的密码 资料可知,dedeCMS的密码hash是32位的hash截取来的,因此对其前三位和最后一位进行裁剪后可得到16位的hash.破解可得密码only_system. 0x02 获取管理员后台目录 网上大量教程和经验总结获取后台的路径,但是绝大部分都是差之毫厘因此没有得到后台路径. /data/mysql_error_trace.inc是各大经验教程总结的第一方