谈一谈网络编程学习经验

  • 时间:
  • 浏览:1

8

2

5

7

建议朋友 去看原文:http://cloud.github.com/downloads/chenshuo/documents/LearningNetworkProgramming.pdf

1

谈一谈网络编程学习经验

陈硕

giantchen@gmail.com

blog.csdn.net/Solstice

weibo.com/giantchen

2012-02-13

本文谈一谈我在学习网络编程方面的一点当时人经验。“网络编程”你这名术语的范围很广,本文指用

Sockets API 开发基于 TCP/IP 的网络应用线程池池,具体定义见“网络编程的各种任务角色”一节。

受限于当时人的经历和经验,这篇文章的适应范围是:

 x86-64 Linux 服务端网络编程,直接或间接使用 Sockets API

 公司内网。不一定是局域网,但总体占据 公司防火墙之内,环境可控

本文肯能不适合:

 PC 客户端网络编程,线程池池运行在客户的 PC 上,环境多变且不可控

 Windows 网络编程

 面向公网的服务线程池池

 高性能网络服务器

本文分另一六个帕累托图:

1. 网络编程的一点胡思乱想,谈谈我对你这名领域的认识

2. 几本必看的书,基本上还是 W. Richard Stevents 那几本

另外,本文这样 有点硬说明时均暗指 TCP 协议,“连接”是“TCP 连接”,“服务端”是“TCP 服务端”。

网络编程的一点胡思乱想

以下胡乱列出我对网络编程的一点想法,前后无关联。

网络编程是哪此?

网络编程是哪此?是熟练使用 Sockets API 吗?说实话,在实际项目里我只用过两次 Sockets API,其

他过后完整性都是使用封装好的网络库。

第一次是 305 年在学校做一另一六个羽毛球赛场计分系统:我用 C# 编写运行在 PC 机上的软件,负责比

分的显示;再用 C# 写了运行在 PDA 上的计分界面,记分员拿着 PDA 记录比分;这两帕累托图线程池池通过 TCP

协议相互通信。这其实是个简单的分布式系统,体育馆有不止一片场地,每个场地完整性都是一名拿 PDA 的

记分员,每个场地完整性都是两台显示比分的 PC 机(显示器是 42 吋平板电视,倒进场地的对角,就是 两边看

台的观众都能看后比分)。这两台 PC 机功能不完整性一样,一台只负责显示当前比分,另一台不需要 负责

与 PDA 通信,并更新数据库里的比分信息。此外,还有一台 PC 机负责周期性地从数据库读出完整性 7 片

场地的比分,显示在体育馆墙上的大屏幕上。这台 PC 上还运行着一另一六个线程池池,负责生成比分数据的静态

页面,通过 FTP 上传发布到某门户网站的体育频道。系统中还有一另一六个录入赛程(参赛队,运动员,出场2

顺序等)数据库的线程池池,运行在数据库服务器上。算下来整个系统有十来个线程池池,运行在二十多台设备

(PC 和 PDA)上,不需要 考虑可靠性。将来有肯能把你这名小系统仔细讲一讲,挺有意思的。

这是我第一次写实际项目中的网络线程池池,当时写下来的感觉是像写命令行与用户交互的线程池池:线程池池

在命令行输出一句提示语,在等待客户输入语录,就是 正确处理客户输入,再输出下一句提示语,这样 循环。

只不过这里的“客户”完整性都是人,就是 就是 线程池池。在建立好 TCP 连接过后,双方的线程池池完整性都是 read/write

循环(为求简单,我用的是 blocking 读写),直到有一方断开连接。

第二次是 2010 年编写 muduo 网络库,我再次拿起了 Sockets API,写了一另一六个基于 Reactor 模式的

C++ 网络库。写你这名库的目的之一就是 想让日常的网络编程从 Sockets API 的琐碎细节中解脱出来,让程

序员专注于业务逻辑,把时间用在刀刃上。Muduo 网络库的示例代码含高了十十哪几个 网络线程池池,哪此程

序都这样 直接使用 Sockets API。

在此之外,无论是实习还是工作,其实我写的线程池池后会通过 TCP 协议与一点线程池池打交道,但我这样

直接使用过 Sockets API。对于 TCP 网络编程,我认为核心是正确处理“另一六个半事件”,见《Muduo 网络编

程示例之零:前言》中的“TCP 网络编程本质论”。线程池池员的主要工作是在事件正确处理函数中实现业务逻

辑,而完整性都是和 Sockets API 较劲。

这里还是这样 说清楚“网络编程”是哪此,请继续阅读后文“网络编程的各种任务角色”。

学习网络编程有用吗?

以上说的是比较底层的网络编程,线程池池代码直接面对从 TCP 或 UDP 收到的数据以及构造数据包发

出去。在实际工作中,另四种 常见 的情况汇报是通过各种 client library 来与服务端打交道,肯能在现成的框

架中填空来实现 server,肯能采用更上层的通信土办法。比如用 libmemcached 与 memcached 打交道,使

用 libpq 来与 PostgreSQL 打交道,编写 Servlet 来响应 http 请求,使用四种 RPC 与一点线程池池通信,等等。

哪此情况汇报后会占据 网络通信,但不一定算作“网络编程”。肯能你的工作是前面列举的哪此,学习

TCP/IP 网络编程还有用吗?

我认为还是有必要学一学,大约在 troubleshooting 的过后有用。无论你是用 libevent/netty/gevent

来写网络线程池池,还是用前述更高层库来通信,哪此 library 或 framework 后会调用底层的 Sockets API 来

实现网络功能。当你的线程池池遇到一另一六个线上问题图片,肯能你熟悉 Sockets API,这样 从 strace 没能发现线程池池卡

在哪里,尽管肯能你这样 直接调用哪此 Sockets API。另外,熟悉 TCP/IP 协议、会用 tcpdump 也大大有

促进分析正确处理线上网络服务问题图片。

在哪此平台上学习网络编程?

对于服务端网络编程,我建议在 Linux 上学习。

肯能在 10 年前,你这名问题图片的答案或许是 FreeBSD,肯能 FreeBSD 根正苗红,在 30 年那一次互联

网浪潮中扮演了重要角色,是就是公司首选的免费服务器操作系统。30 年那会儿 Linux 还远未性性成熟是什么图片 期图片 图片 期的句子,

连 epoll 都还这样 实现。(FreeBSD 在 301 年发布 4.1 版,加入了 kqueue,从此 C10k 完整性都是问题图片。)

10 年后的今天,事情起了变化,Linux 成为了市场份额最大的服务器操作系统

1

。在 Linux 你这名大众

系统上学网络编程,遇到哪此问题图片会比较容易正确处理。肯能用的人多,你遇到的问题图片别人多半也遇到过;

1

9

6