A.1.7 几个术语
互联网上的很多"口水战"是由对同一术语的不同理解引起的,比如我写的《多线程服务器的适用场合》3,就曾经被人说是"挂羊头卖狗肉",因为这篇文章中举的master 例子"根本就算不上是个网络服务器。因为它的瓶颈根本就跟网络无关。"
网络服务器 "网络服务器"这个术语确实含义模糊,到底指硬件还是软件?到底是服务于网络本身的机器(交换机、路由器、防火墙、NAT),还是利用网络为其他人或程序提供服务的机器(打印服务器、文件服务器、邮件服务器)?每个人根据自己熟悉的领域,可能会有不同的解读。比方说,或许有人认为只有支持高并发、高吞吐量的才算是网络服务器。
为了避免无谓的争执,我只用"网络服务程序"或者"网络应用程序"这种含义明确的术语。"开发网络服务程序"通常不会造成误解。
客户端?服务端? 在TCP 网络编程(www.cppentry.com)中,客户端和服务端很容易区分,主动发起连接的是客户端,被动接受连接的是服务端。当然,这个"客户端"本身也可能是个后台服务程序,HTTP proxy 对HTTP server 来说就是个客户端。
客户端编程(www.cppentry.com)?服务端编程(www.cppentry.com)? 但是"服务端编程(www.cppentry.com)"和"客户端编程(www.cppentry.com)"就不那么好区分了。比如Web crawler,它会主动发起大量连接,扮演的是HTTP 客户端的角色,但似乎应该归入"服务端编程(www.cppentry.com)"。又比如写一个HTTP proxy,它既会扮演服务端--被动接受Web browser 发起的连接,也会扮演客户端--主动向HTTP server 发起连接,它究竟算服务端还是客户端?我猜大多数人会把它归入服务端编程(www.cppentry.com)。
那么究竟如何定义"服务端编程(www.cppentry.com)"?
服务端编程(www.cppentry.com)需要处理大量并发连接?也许是,也许不是。比如云风在一篇介绍网游服务器的博客4 中就谈到,网游中用到的"连接服务器"需要处理大量连接,而"逻辑服务器"只有一个外部连接。那么开发这种网游"逻辑服务器"算服务端编程(www.cppentry.com)还是客户端编程(www.cppentry.com)呢?又比如机房的服务进程监控软件,并发数跟机器数成正比,至多也就是两三千的并发连接。(再大规模就超出本书的范围了。)
我认为,"服务端网络编程(www.cppentry.com)"指的是编写没有用户界面的长期运行的网络程序,程序默默地运行在一台服务器上,通过网络与其他程序打交道,而不必和人打交道。与之对应的是客户端网络程序,要么是短时间运行,比如wget;要么是有用户界面(无论是字符界面还是图形界面)。本文主要谈服务端网络编程(www.cppentry.com)。