欢迎来到天天文库
浏览记录
ID:9089377
大小:77.00 KB
页数:22页
时间:2018-04-17
《谈一谈网络编程学习经验》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、谈一谈网络编程学习经验作者:陈硕 来源:博客园 发布时间:2011-07-0516:07 阅读:1842次 推荐:0 原文链接 [收藏] 本文谈一谈我在学习网络编程方面的一些个人经验。“网络编程”这个术语的范围很广,本文指用SocketsAPI开发基于TCP/IP的网络应用程序,具体定义见“网络编程的各种任务角色”一节。受限于本人的经历和经验,这篇文章的适应范围是:·x86-64Linux服务端网络编程,直接或间接使用SocketsAPI·公司内网。不一定是局域网,但总体位于公司防火墙之内,环境
2、可控本文可能不适合:·PC客户端网络编程,程序运行在客户的PC上,环境多变且不可控·Windows网络编程·面向公网的服务程序·高性能网络服务器本文分两个部分:1.网络编程的一些胡思乱想,谈谈我对这一领域的认识2.几本必看的书,基本上还是W.RichardStevents那几本另外,本文没有特别说明时均暗指TCP协议,“连接”是“TCP连接”,“服务端”是“TCP服务端”。网络编程的一些胡思乱想以下胡乱列出我对网络编程的一些想法,前后无关联。网络编程是什么?网络编程是什么?是熟练使用SocketsAPI吗?说
3、实话,在实际项目里我只用过两次SocketsAPI,其他时候都是使用封装好的网络库。第一次是2005年在学校做一个羽毛球赛场计分系统:我用C#编写运行在PC机上的软件,负责比分的显示;再用C#写了运行在PDA上的计分界面,记分员拿着PDA记录比分;这两部分程序通过TCP协议相互通信。这其实是个简单的分布式系统,体育馆有不止一片场地,每个场地都有一名拿PDA的记分员,每个场地都有两台显示比分的PC机(显示器是42吋平板电视,放在场地的对角,这样两边看台的观众都能看到比分)。这两台PC机功能不完全一样,一台只负责
4、显示当前比分,另一台还要负责与PDA通信,并更新数据库里的比分信息。此外,还有一台PC机负责周期性地从数据库读出全部7片场地的比分,显示在体育馆墙上的大屏幕上。这台PC上还运行着一个程序,负责生成比分数据的静态页面,通过FTP上传发布到某门户网站的体育频道。系统中还有一个录入赛程(参赛队,运动员,出场顺序等)数据库的程序,运行在数据库服务器上。算下来整个系统有十来个程序,运行在二十多台设备(PC和PDA)上,还要考虑可靠性。将来有机会把这个小系统仔细讲一讲,挺有意思的。这是我第一次写实际项目中的网络程序,当时
5、写下来的感觉是像写命令行与用户交互的程序:程序在命令行输出一句提示语,等待客户输入一句话,然后处理客户输入,再输出下一句提示语,如此循环。只不过这里的“客户”不是人,而是另一个程序。在建立好TCP连接之后,双方的程序都是read/write循环(为求简单,我用的是blocking读写),直到有一方断开连接。第二次是2010年编写muduo网络库,我再次拿起了SocketsAPI,写了一个基于Reactor模式的C++网络库。写这个库的目的之一就是想让日常的网络编程从SocketsAPI的琐碎细节中解脱出来,让
6、程序员专注于业务逻辑,把时间用在刀刃上。Muduo网络库的示例代码包含了几十个网络程序,这些示例程序都没有直接使用SocketsAPI。在此之外,无论是实习还是工作,虽然我写的程序都会通过TCP协议与其他程序打交道,但我没有直接使用过SocketsAPI。对于TCP网络编程,我认为核心是处理“三个半事件”,见《Muduo网络编程示例之零:前言》中的“TCP网络编程本质论”。程序员的主要工作是在事件处理函数中实现业务逻辑,而不是和SocketsAPI较劲。这里还是没有说清楚“网络编程”是什么,请继续阅读后文“网
7、络编程的各种任务角色”。学习网络编程有用吗?以上说的是比较底层的网络编程,程序代码直接面对从TCP或UDP收到的数据以及构造数据包发出去。在实际工作中,另一种常见的情况是通过各种clientlibrary来与服务端打交道,或者在现成的框架中填空来实现server,或者采用更上层的通信方式。比如用libmemcached与memcached打交道,使用libpq来与PostgreSQL打交道,编写Servlet来响应http请求,使用某种RPC与其他进程通信,等等。这些情况都会发生网络通信,但不一定算作“网络编
8、程”。如果你的工作是前面列举的这些,学习TCP/IP网络编程还有用吗?我认为还是有必要学一学,至少在troubleshooting的时候有用。无论如何,这些library或framework都会调用底层的SocketsAPI来实现网络功能。当你的程序遇到一个线上问题,如果你熟悉SocketsAPI,那么从strace不难发现程序卡在哪里,尽管可能你没有直接调用这些SocketsAPI。另外,熟悉TC
此文档下载收益归作者所有