A.1.1 网络编程(www.cppentry.com)是什么
网络编程(www.cppentry.com)是什么?是熟练使用Sockets API 吗?说实话,在实际项目里我只用过
两次Sockets API,其他时候都是使用封装好的网络库。
第一次是2005 年在学校做一个羽毛球赛场计分系统:我用C# 编写运行在PC上的软件,负责比分的显示;再用C# 写了运行在PDA 上的计分界面,记分员拿着PDA 记录比分;这两部分程序通过TCP 协议相互通信。这其实是个简单的分布式系统,体育馆有几片场地,每个场地都有一名拿PDA 的记分员,每个场地都有两台显示比分的PC (显示器是42 寸平板电视,放在场地的对角,这样两边看台的观众都能看到比分)。这两台PC 的功能不完全一样,一台只负责显示当前比分,另一台还要负责与PDA 通信,并更新数据库里的比分信息。此外,还有一台PC 负责周期性地从数据库读出全部7 片场地的比分,显示在体育馆墙上的大屏幕上。这台PC 上还运行着一个程序,负责生成比分数据的静态页面,通过FTP 上传发布到某门户网站的体育频道。系统中还有一个录入赛程(参赛队、运动员、出场顺序等)数据库的程序,运行在数据库服务器上。算下来整个系统有十来个程序,运行在二十多台设备(PC 和PDA)上,还要考虑可靠性,避免single point of failure。
这是我第一次写实际项目中的网络程序,当时写下来的感觉是像写命令行与用户交互的程序:程序在命令行输出一句提示语,等待客户输入一句话,然后处理客户输入,再输出下一句提示语,如此循环。只不过这里的"客户"不是人,而是另一个程序。在建立好TCP 连接之后,双方的程序都是read/write 循环(为求简单,我用的是blocking 读写),直到有一方断开连接。
第二次是2010 年编写mudu网络库,我再次拿起了Sockets API,写了一个基于Reactor 模式的C++(www.cppentry.com) 网络库。写这个库的目的之一就是想让日常的网络编程(www.cppentry.com)从Sockets API 的琐碎细节中解脱出来,让程序员专注于业务逻辑,把时间用在刀刃上。mudu网络库的示例代码包含了几十个网络程序,这些示例程序都没有直接使用Sockets API。
在此之外,无论是实习还是工作,虽然我写的程序都会通过TCP 协议与其他程序打交道,但我没有直接使用过Sockets API。对于TCP 网络编程(www.cppentry.com),我认为核心是处理"三个半事件",见§6.4.1 "TCP 网络编程(www.cppentry.com)本质论"。程序员的主要工作是在事件处理函数中实现业务逻辑,而不是和Sockets API"较劲"。
这里还是没有说清楚"网络编程(www.cppentry.com)"是什么,请继续阅读后文§A.1.5"网络编程(www.cppentry.com)的各种任务角色"。