【卷二】网络编程 一
2.1 客户端/服务器架构
服务器(Server)是什么东东,有什么用?只知道上网要Web服务器,当然啰,跳出天朝的防火墙
跑到外国去冲浪也要哦!
简单地说,服务器(Server)就是为多个客户端(可以是你的电脑或浏览器)提供服务的, 它存在的
唯一目的就是等待客户端(Client-side)的请求,并响应它们,然后等待更多的请求......
参考: 《Python核心编程(3rd)》 P49~P55
2.2 硬件客户端/服务器架构
打印Server是硬件服务器的一个例子。它们处理传入的打印作业并将其发送给系统中的打印机或其
它打印设备。这样的计算机通常可以通过网络进行访问,并且客户端计算机将向它发送打印请求!
硬件计算机的另一个例子就是文件服务器,这些通常拥有庞大容量的计算机,可以被客户端远程访
问。客户端计算机会挂载服务器计算机上的磁盘(disk),看上去好像disk就在本地计算机(local host)上一
样。
2.3 软件客户端/服务器架构
软件服务器也运行在一块硬件上,但是没有像硬件服务器那样的专用外围设备(如打印机,磁盘驱动
器等)。软件服务器提供的主要服务包括程序执行,数据传输检索,聚合,更新,或其他类型的编程或数据
操作。
现在一个更常见的软件服务器就是Web服务器。如果个人或公司想要运行自己的Web Server,那么
必须拥有一台或多台Computer,在上面安装希望提供给用户的Web页面和Web应用程序,然后启动Web
服务器。一个这样的服务器就是接受客户端请求,并向Web客户端(即用户计算机上的浏览器)回送 Web页
面,然后等待下一个客户端的请求。这些服务器一旦开启,除非外力,否则将永远运行......
数据库服务器是另一种类型的软件服务器,它们接受客户端的存储或检索请求,响应请求,然后等待
更多的事务 ,和Web服务器类似,它们也是永远运行的!
最后一类软件服务器就是窗体服务器,它们运行在一台附带(外接)显示设备(如显示器)的计算机
上,窗体客户端其实就是一些程序,这些程序需要一个窗口化的环境来运行。这些通常被当作图形用户界面
(GUI) 应用程序。 如果在没有窗体服务器的情况下运行它们,也即意味着在一个基于文本的环境中, 如
DOS窗口或一个UNIX shell中,那么将无法启动它们。一旦能够访问窗体服务器,那么一切都会正常!
2.4 套接字:通信端点
在玩转服务器之前,先来说说作为通信端点的套接字(Socket)客户端请求之前,必须进行一些初步的
设置流程来为之后的工作做准备,首先会创建一个通信接点,它能够使服务器监听请求。
如果把服务器比作公司主线呼叫的总机接线员。 一旦电话号码和设备安装成功且接线员到达后,服务
就可以开始了! 巴啦巴啦,其实,我们只要知道在通信开始之前, 网络应用程序要创建套接字就对了,可将
它们比作电话插孔,没有它们,通信就无法进行!
1. 创建套接字的方法, 要用到socket模块的socket.socket()函数!
1 import socket 2 3 socket.socket(socket_family, socket_type, protocol = 0)
用 "from socket import *" 这种方法可以导入socket模块的所有属性,大大节省代码
from socket import * socket(scoket_family, socket_type)
2.4.1 socket_family: 套接字家族
UNIX套接字是我们所讲的套接字的第一个家族,它拥有一个"家族名称" AF_UNIX,它表示地址家族
—UNIX, AF是地址家族(address family)的缩写!
第二个家族是面向网络的, 它也有自己的家族名字 "AF_INET" 或者说地址家族—因特网!
另一个地址家族是AF_INET6用于第6版因特网协议(IPv6)寻址,大家可以打开网络中心,查看本地
连接属性,即可知道,除了一个IPv6,还有一个当前使用的因特网协议 IPv4,在所有的地址家族中,"AF
_INET" 是使用最广泛的!
2.4.2 socket_type:套接字类型
1. 面向连接的套接字
无论采用哪种地址家族, 都有两种风格的套接字,一种是面向连接的,一种是无连接的!第一种是面
向连接的, 顾名思义,在进行通信之前必须先建立一个连接, 例如,使用电话系统给一个朋友打电话。这
种类型的通信也称为虚拟电路或流套接字。
面向连接的通信提供序列化的,可靠的和不重复的数据交付,而没有记录边界。 这基本上意味着每条
信息可以拆分为多个片段,并且每一条消息片段都确保能够到达目的地,然后,将它们按顺序组合在一起,
最后将完整消息传递给正在等待的应用程序。
实现这种连接类型的主要协议是传输控制协议 — TCP: (Transmission Control Protocol) 。为了创
建TCP套接字,必须使用 SOCK_STREAM 作为套接字类型。 TCP 套接字的名字 SOCK_STREAM 基于流
套接字的其中一种表示。因为这些套接字 (AF_INET) 的网络版本使用因特网协议(IP: Internet Protocol)
来搜寻网络中的主机,所以整个系统通常结合这两种协议 (TCP和IP)来进行(当然,也可以使用TCP和本
地 [非网络的AF_LOCAL/AF_UNIX] 套接字,但是很明显此时并没有使用IP)
2. 创建 TCP/IP 套接字,用下面的方法调用socket.socket()
1 # 导入socket模块的所有特性 2 from socket import * 3 4 socket(AF_INET, SOCK.STREAM)
2. 无连接的套接字
与虚拟电路形成鲜明对比的是数据报类型的套接字,它是一种无连接的套接字。这意味着,在通信开
始前并不需要建立连接,此时,在数据传输过程中并无法保证它的顺序性,可靠性或重复性。然而,数据报
确实保存了记录边界,这意味消息是以整体发送的,而并非首先分成多个片段,例如,使用面向连接的协议!
那么,使用数据报套接字有什么优点呢?由于面向连接的套接字所提供的保证,因此它们的设置以及
对虚拟电路连接的维护所需要大量的开销。然而,数据报不需要这些开销,即它的成本very low!
实现这种连接类型的主要协议是用户数据报协议—UDP: (Uesr Datagram Protocol), 为了创建UD
P 套接字,必须使用 SOCK_DGRAM 作为套接字类型。你可能知道,UPD套接字的SOCK_DGRAM 名字来
自于单词 "datagram" (数据报)。因为这些套接字也使用因特网协议来寻找网络中的主机,所以这个系统也
有一个更加普通的名字,即这两种协议(UDP的IP) 的组合名字,或 UDP/IP。
3. 同样,为了创建UDP/IP套接字,需要执行以下语句
1 # 导入socket 模块的所有特性 2 from socket import * 3 4 socket(AF_INET, SOCK_DGRAM)
创建TCP服务器和客户端请参照: http://www.cnblogs.com/Ruby517/p/5811714.html