网络协议编写的三层境界 - 程序即人生 - CSDN博客

网络协议编写的三层境界收藏

  此文于2011-03-02被推荐到CSDN首页

如何被推荐?

write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie

新浪微博 -- 腾讯微博 -- 讨论新闻组 -- 代码库 -- 豆瓣

免责声明

本文不会涉及到你该使用UDP还是TCP,是FTP还是HTTP,也就是跟P都没有关系。^^同时,也不涉及该使用私有协议还是标准协议,还是在标准协议下使用私有协议,而是会谈及在具体的协议编写的时候,使用哪种编写的方式会更好。由于本人的知识有限,谈及利弊时,主要以使用C++编写服务端时的经验为主,至于同时适不适用于其他语言,就靠童鞋们自己分辨了。

第一层境界:新手入门

因为我一开始工作的第一家公司就是精于服务端程序编写的公司(运营过百万级同时在线以上),所以实际上我以前都不太清楚真有公司处于此水平,直到真的碰到时,我才惊慌失措,感叹不已。

特点:信手拈来,直观质朴

也就是写一个结构,在任何需要使用的时候(典型环境就是打包解包,读写文件)一个变量一个变量的通过memcpy等方式处理。简单是简单,没有任何抽象。

但是,

1.非常的不符合DRY原则,在此情况下,服务器端的打包解包代码和客户端的打包解包代码都得两份。别说服务器只需要打包,客户端只需要解包,这是太理想的情况,太经常一个小结构会需要传来传去的。而无论这个结构用多少次,你都得多为其写一次代码。

2.扩展性差:任何底层协议的改动,你都得更改除了相关数据结构意外的地方,(这也算是不符合DRY原则带来的副作用)而且此更改你往往得通过搜索才能完成。甚至,同一个数据结构即使仅仅是打包解包都做不到DRY原则。需要进行版本控制时,相关代码也会散布在各打包解包各处,更何况,当你想要以其他方式(比如写入文件)保存此数据结构的时候,你又得重新来一次,简直就是不人道的。

3.容易出错:在上层打包解包代码,都需要关注于每个结构的每个字段的数据类型,任何一个类型错误,你能够预期到的最好结果就是crash。

第二层境界:序列化

通过序列化的概念,通过函数抽象实现同一个数据结构打包解包的DRY。通过函数重载,减少不同类型的不同处理。

特点:统一接口,各司其职

面向对象有的时候会代码对象层次过多等乱七八糟的问题,但是此处面向对象的使用,我感觉实在是太淋漓尽致的体现将面向对象的好处了。我记得以前有个关于对象设计的原则,那就是告诉对象要做什么,而不是去获取数据自己来做。在第一层境界中的做法就完全是自己获取结构中的数据,外部来完成工作,为什么不更面向对象一点,让这种工作由对象本身来完成呢?此时,因为序列化的本质是从接口到二进制之间的转换,对于网络打包解包,文件读写可以做到通过传入不同参数用同样的接口来完成,对于每个类/结构的数据只需要进行一次的编码,极大的减少了错误的发生概率。 能达到这个境界的工作已经算是比较有技术的公司了。

但是,

1.对于服务器客户端语言不同时的情况,再次的无法实现DRY,典型的应用就是以JAVA写服务器,而以C++写游戏时。

2.版本控制还是太过于手动化。

第三层境界: 代码生成代码

《Unix编程艺术》中描述的至高境界....代码生成代码,元编程的本质。第一次领悟这种境界是通过Google Protobuf,后来还知道一个thrift。

特点:描述结构,自动生成

以GoogleProtobuf为例,在写一个网络协议的时候,你不是直接的用一种语言编写协议,而是用特定的描述语言来描述这个协议的内容,然后通过工具自动的生成你需要的特定语言的结构。这样的好处是一次的描述,可以自动的为你生成多个语言的协议文件。(DRY,Protobuf官方支持C++,JAVA,Python,第三方支持的更多)更重要的是,这个接口的打包解包接口已经也生成好了,直接调用即可。当然,这个方法也不是完美的,简单的说,你需要学习怎么描述这个协议,你需要用工具生成代码,简单的说就是比直接写增加了复杂性。

小结:

其实还有其他的协议编写方式,比如用XML,Json的纯文本协议,这个也是一种较佳的方式,调试非常方便,只是效率上比起二进制的还有差距,而在第三层境界中,为了调试方便,为生成的结构增加一个日志输出接口,也能较为方便的调试。

原创文章作者保留版权 转载请注明原作者 并给出链接

write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie

网络协议编写的三层境界收藏

  此文于2011-03-02被推荐到CSDN首页

如何被推荐?

write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie

新浪微博 -- 腾讯微博 -- 讨论新闻组 -- 代码库 -- 豆瓣

免责声明

本文不会涉及到你该使用UDP还是TCP,是FTP还是HTTP,也就是跟P都没有关系。^^同时,也不涉及该使用私有协议还是标准协议,还是在标准协议下使用私有协议,而是会谈及在具体的协议编写的时候,使用哪种编写的方式会更好。由于本人的知识有限,谈及利弊时,主要以使用C++编写服务端时的经验为主,至于同时适不适用于其他语言,就靠童鞋们自己分辨了。

第一层境界:新手入门

因为我一开始工作的第一家公司就是精于服务端程序编写的公司(运营过百万级同时在线以上),所以实际上我以前都不太清楚真有公司处于此水平,直到真的碰到时,我才惊慌失措,感叹不已。

特点:信手拈来,直观质朴

也就是写一个结构,在任何需要使用的时候(典型环境就是打包解包,读写文件)一个变量一个变量的通过memcpy等方式处理。简单是简单,没有任何抽象。

但是,

1.非常的不符合DRY原则,在此情况下,服务器端的打包解包代码和客户端的打包解包代码都得两份。别说服务器只需要打包,客户端只需要解包,这是太理想的情况,太经常一个小结构会需要传来传去的。而无论这个结构用多少次,你都得多为其写一次代码。

2.扩展性差:任何底层协议的改动,你都得更改除了相关数据结构意外的地方,(这也算是不符合DRY原则带来的副作用)而且此更改你往往得通过搜索才能完成。甚至,同一个数据结构即使仅仅是打包解包都做不到DRY原则。需要进行版本控制时,相关代码也会散布在各打包解包各处,更何况,当你想要以其他方式(比如写入文件)保存此数据结构的时候,你又得重新来一次,简直就是不人道的。

3.容易出错:在上层打包解包代码,都需要关注于每个结构的每个字段的数据类型,任何一个类型错误,你能够预期到的最好结果就是crash。

第二层境界:序列化

通过序列化的概念,通过函数抽象实现同一个数据结构打包解包的DRY。通过函数重载,减少不同类型的不同处理。

特点:统一接口,各司其职

面向对象有的时候会代码对象层次过多等乱七八糟的问题,但是此处面向对象的使用,我感觉实在是太淋漓尽致的体现将面向对象的好处了。我记得以前有个关于对象设计的原则,那就是告诉对象要做什么,而不是去获取数据自己来做。在第一层境界中的做法就完全是自己获取结构中的数据,外部来完成工作,为什么不更面向对象一点,让这种工作由对象本身来完成呢?此时,因为序列化的本质是从接口到二进制之间的转换,对于网络打包解包,文件读写可以做到通过传入不同参数用同样的接口来完成,对于每个类/结构的数据只需要进行一次的编码,极大的减少了错误的发生概率。 能达到这个境界的工作已经算是比较有技术的公司了。

但是,

1.对于服务器客户端语言不同时的情况,再次的无法实现DRY,典型的应用就是以JAVA写服务器,而以C++写游戏时。

2.版本控制还是太过于手动化。

第三层境界: 代码生成代码

《Unix编程艺术》中描述的至高境界....代码生成代码,元编程的本质。第一次领悟这种境界是通过Google Protobuf,后来还知道一个thrift。

特点:描述结构,自动生成

以GoogleProtobuf为例,在写一个网络协议的时候,你不是直接的用一种语言编写协议,而是用特定的描述语言来描述这个协议的内容,然后通过工具自动的生成你需要的特定语言的结构。这样的好处是一次的描述,可以自动的为你生成多个语言的协议文件。(DRY,Protobuf官方支持C++,JAVA,Python,第三方支持的更多)更重要的是,这个接口的打包解包接口已经也生成好了,直接调用即可。当然,这个方法也不是完美的,简单的说,你需要学习怎么描述这个协议,你需要用工具生成代码,简单的说就是比直接写增加了复杂性。

小结:

其实还有其他的协议编写方式,比如用XML,Json的纯文本协议,这个也是一种较佳的方式,调试非常方便,只是效率上比起二进制的还有差距,而在第三层境界中,为了调试方便,为生成的结构增加一个日志输出接口,也能较为方便的调试。

原创文章作者保留版权 转载请注明原作者 并给出链接

write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie


相关内容

  • 专访顾伟:从机械工程师到资深软件工程师.再到微软MVP的蜕变
  • 发表于2014-05-27 08:52| 20382次阅读| 来源CSDN| 168 条评论| 作者张勇 社区之星顾伟访谈.NETC#云计算敏捷Windows Phone 8开源微软 摘要:顾伟曾是一名机械工程师,毕业后听从自己内心声音走上了软件编程道路.他利用平时休息时间,完成从编程新手.到合格的 ...

  • 通过银行卡号获取所属银行名称
  • 分享到 一键分享QQ空间新浪微博百度云收藏人人网腾讯微博百度相册开心网腾讯朋友百度贴吧豆瓣网搜狐微博百度新首页QQ好友和讯微博更多... 百度分享 登录?|?注册 收藏成功 确定 收藏失败,请重新收藏 确定 标题 标题不能为空 网址 标签 摘要 公开 分享资讯传PPT/文档提问题写博客传资源创建项目 ...

  • 简评游戏人工智能相关的中文书(上) - 赖勇浩的编程私伙局 - CSDN博客
  • 简评游戏人工智能相关的中文书(上)收藏 此文于2009-09-15被推荐到CSDN首页 如何被推荐? 赖勇浩(http://laiyonghao.com) 引言 因为心中的傻傻的梦想,高考我报了计算机专业:也因为傻傻的梦想,我在大学年代阅读了好些关于人工智能的图书:也因为傻傻的梦想,在工作后我把兴趣 ...

  • 用C语言写解释器(一)--我们的目标
  • 用C语言写解释器(一)--我们的目标 分类: 算法讨论 拍拍脑袋 用C语言写解释器 2009-10-18 16:24 11054人阅读 评论(17) 收藏 举报 语言cbasic编程input 目录(?)[+] 声明 为提高教学质量,我所在的学院正在筹划编写C语言教材.<用C语言写解释器> ...

  • 就业面试题
  • 1. 简述OC 中内存管理机制.与retain 配对使用的方法是dealloc 还是release , 为什么?需要与alloc 配对使用的方法是dealloc 还是release ,为什么?readwrite ,readonly ,assign ,retain ,copy ,nonatomic . ...

  • js 表格 万条记录
  • Js表格万条数据瞬间加载实现代码_javascript技巧_脚本之家 bar.attachEvent("onscroll", function () { ... bar.addEventListener("scroll", function () { ... ...

  • 关于电源滤波电容
  • 关于电源滤波电容(2008-07-06 10:40:45) 标签:杂谈 分类:电阻--电容--电感 问题: 请问电源的滤波电容的通常是一个大的并联一个小的,两个相差100倍,但是那个大的电容有的用10u ,有的用47u ,还有的用4.7u ,这是怎么回事,应该怎么选择啊? 大的是电解电容,滤波用的, ...

  • 浅析网络安全与加强网络管理必要性
  • 摘 要:近年来,全球信息化逐渐加快,我国的网络也快速发展起来.同时网络的安全性也逐渐被人们关注.本文中主要介绍了在信息化快速发展的今天如何进行网络安全的管理. 关键词:网络安全 网络管理 措施 中图分类号:TN915.07 文献标识码:A 文章编号:1003-9082(2013)09-0006-02 ...

  • 2010 我的求职经历(完结篇) - .NET技术 / ASP.NET
  • 新公司刚转正,谈谈自己换工作的面试经历,希望对找工作的朋友有用. 很早以前就想换工作(写过一次面试经历,请参考ASP.NET面试经历分享),但总是因为某些各种原因,未能付诸行动.离开原公司的主要原因还是个人发展的问题(原公司.老板对我还是很不错的),其它就不提啦. 毕竟在公司待了很久,我没有选择传统 ...