合肥网站建设工作室

关注合肥工作室微信公众号,提供最新网站建设资讯

扫一扫微信二维码

谈一谈网络编程学习经验

2011-06-09 07:50:44建站知识

网络编程的一些胡思乱想OWA合肥网站工作室|合肥网站建设优化推广 - 合肥LZ建站工作室
以下胡乱列出我对网络编程的一些想法,前后无关联。OWA合肥网站工作室|合肥网站建设优化推广 - 合肥LZ建站工作室

网络编程是什么?OWA合肥网站工作室|合肥网站建设优化推广 - 合肥LZ建站工作室
网络编程是什么?是熟练使用Sockets API吗?说实话,在实际项目里我只用过两次Sockets API,其他时候都是使用封装好的网络库。OWA合肥网站工作室|合肥网站建设优化推广 - 合肥LZ建站工作室

第一次是2005年在学校做一个羽毛球赛场计分系统:我用C# 编写运行在PC机上的软件,负责比分的显示;再用C# 写了运行在PDA上的计分界面,记分员拿着PDA记录比分;这两部分程序通过 TCP协议相互通信。这其实是个简单的分布式系统,体育馆有不止一片场地,每个场地都有一名拿PDA的记分员,每个场地都有两台显示比分的PC机(显示器是42吋平板电视,放在场地的对角,这样两边看台的观众都能看到比分)。这两台PC机功能不完全一样,一台只负责显示当前比分,另一台还要负责与PDA通信,并更新数据库里的比分信息。此外,还有一台PC机负责周期性地从数据库读出全部7片场地的比分,显示在体育馆墙上的大屏幕上。这台PC上还运行着一个程序,负责生成比分数据的静态页面,通过FTP上传发布到某门户网站的体育频道。系统中还有一个录入赛程(参赛队,运动员,出场顺序等)数据库的程序,运行在数据库服务器上。算下来整个系统有十来个程序,运行在二十多台设备(PC和PDA)上,还要考虑可靠性。将来有机会把这个小系统仔细讲一讲,挺有意思的。OWA合肥网站工作室|合肥网站建设优化推广 - 合肥LZ建站工作室

这是我第一次写实际项目中的网络程序,当时写下来的感觉是像写命令行与用户交互的程序:程序在命令行输出一句提示语,等待客户输入一句话,然后处理客户输入,再输出下一句提示语,如此循环。只不过这里的“客户”不是人,而是另一个程序。在建立好TCP连接之后,双方的程序都是read/write循环(为求简单,我用的是blocking读写),直到有一方断开连接。OWA合肥网站工作室|合肥网站建设优化推广 - 合肥LZ建站工作室

第二次是2010年编写muduo网络库,我再次拿起了Sockets API,写了一个基于Reactor模式的C++ 网络库。写这个库的目的之一就是想让日常的网络编程从Sockets API的琐碎细节中解脱出来,让程序员专注于业务逻辑,把时间用在刀刃上。Muduo 网络库的示例代码包含了几十个网络程序,这些示例程序都没有直接使用Sockets API。OWA合肥网站工作室|合肥网站建设优化推广 - 合肥LZ建站工作室

在此之外,无论是实习还是工作,虽然我写的程序都会通过TCP协议与其他程序打交道,但我没有直接使用过Sockets API。对于TCP网络编程,我认为核心是处理“三个半事件”,见《Muduo 网络编程示例之零:前言》中的“TCP 网络编程本质论”。程序员的主要工作是在事件处理函数中实现业务逻辑,而不是和Sockets API较劲。OWA合肥网站工作室|合肥网站建设优化推广 - 合肥LZ建站工作室

这里还是没有说清楚“网络编程”是什么,请继续阅读后文“网络编程的各种任务角色”。OWA合肥网站工作室|合肥网站建设优化推广 - 合肥LZ建站工作室

学习网络编程有用吗?OWA合肥网站工作室|合肥网站建设优化推广 - 合肥LZ建站工作室
以上说的是比较底层的网络编程,程序代码直接面对从TCP或UDP收到的数据以及构造数据包发出去。在实际工作中,另一种常见 的情况是通过各种 client library 来与服务端打交道,或者在现成的框架中填空来实现server,或者采用更上层的通信方式。比如用libmemcached与memcached打交道,使用libpq来与PostgreSQL 打交道,编写Servlet来响应http请求,使用某种RPC与其他进程通信,等等。这些情况都会发生网络通信,但不一定算作“网络编程”。如果你的工作是前面列举的这些,学习TCP/IP网络编程还有用吗?OWA合肥网站工作室|合肥网站建设优化推广 - 合肥LZ建站工作室

我认为还是有必要学一学,至少在troubleshooting 的时候有用。无论如何,这些library或framework都会调用底层的Sockets API来实现网络功能。当你的程序遇到一个线上问题,如果你熟悉Sockets API,那么从strace不难发现程序卡在哪里,尽管可能你没有直接调用这些Sockets API。另外,熟悉TCP/IP协议、会用tcpdump也大大有助于分析解决线上网络服务问题。OWA合肥网站工作室|合肥网站建设优化推广 - 合肥LZ建站工作室

在什么平台上学习网络编程?OWA合肥网站工作室|合肥网站建设优化推广 - 合肥LZ建站工作室
对于服务端网络编程,我建议在Linux上学习。OWA合肥网站工作室|合肥网站建设优化推广 - 合肥LZ建站工作室

如果在10年前,这个问题的答案或许是FreeBSD,因为FreeBSD根正苗红,在2000年那一次互联网浪潮中扮演了重要角色,是很多公司首选的免费服务器操作系统。2000年那会儿Linux还远未成熟,连epoll都还没有实现。(FreeBSD在2001年发布4.1版,加入了kqueue,从此C10k不是问题。)OWA合肥网站工作室|合肥网站建设优化推广 - 合肥LZ建站工作室

10年后的今天,事情起了变化,Linux成为了市场份额最大的服务器操作系统(http://en.wikipedia.org/wiki/Usage_share_of_operating_systems)。在Linux这种大众系统上学网络编程,遇到什么问题会比较容易解决。因为用的人多,你遇到的问题别人多半也遇到过;同样因为用的人多,如果真的有什么内核bug,很快就会得到修复,至少有work around的办法。如果用别的系统,可能一个问题发到论坛上半个月都不会有人理。从内核源码的风格看,FreeBSD更干净整洁,注释到位,但是无奈它的市场份额远不如Linux,学习Linux是更好的技术投资。

本文关键词
网络编程学习,网络编程经验