客户端和服务器

唔,直白地将就是客户向服务器请求服务,然后服务器给客户提供服务。。。此客户端/服务器(以下简称C/S)架构包含硬件的C/S架构和软件的C/S架构。像打印服务器处理打印任务,然后把这些任务发给相应的打印机,文件服务器提供大量的存储空间。软件服务器像是Web服务器,数据库服务器等等。。。唯一一个需要注意的是窗口服务器,它们运行在一个有显示器的机器上,而窗口客户端则是那些在运行时需要窗口环境的程序,它们一般叫做图形用户界面(GUI)程序。一般情况下,窗口客户端的显示和窗口服务器的提供都在同一台电脑上,但是在X window之类的网络化的窗口环境中,可以选择其他电脑的窗口服务器而显示,即在一台电脑上运行GUI程序,在另一台电脑上显示。

对于其他的诸如NFS,FTP,WEB等服务,服务器和客户端很清楚。一般情况下,你用自己的电脑连到对端提供服务的机器上,那么自己的电脑就是客户端,对端就是服务器。但是如果用VNC之类的可以显示对端界面的软件连接到对端的机器上是,哪个是服务器,哪个又是客户端呢?

对于X Window,基本上分成X Server和X Client两部分。X Server管理硬件,而X Client则是应用程序。X Client会将所要呈现的界面告诉X Server,然后由X Server来将结果绘制出来。X Server的重点是管理客户端的硬件,包括接受键盘/鼠标等设备的输入信息,并且将结果绘制到屏幕上。换句话说,我们自己的电脑提供的是X Server,是窗口服务器,而对端的电脑提供的是X Client,是窗口客户端。


那客户端和服务器之间是如何通信的呢?首先,服务器先要创建一个通信端点,让服务器能够监听请求。然后客户端发送请求。服务器在接受到这个请求后会生成一个子进程(进程号同主进程,相当于是拷贝)来处理这个请求,而它本身,也可以称之为主进程,仍在继续监听着。而accept()函数是阻塞式的。以此只能处理一个请求。


套接字

套接字就是之前所说的通信端点,一开始,套接字就是被设计用于进程间的通信(IPC)。套接字有两种,一种是基于文件型的,这一般指的就是本地上的进程之间,还有一种是基于网络的,无需多说这就是网络上的进程之间通信。

套接字有两个“家族”,一个是基于文件的,名为“AF_UNIX",另一个就是基于网络的,名为”AF_INET"。

套接字的地址包含主机名与端口号。无论使用那一种家族,套接字的协议类型只有两种,一种是面向连接的套接字,即在通信之前要建立一条连接,这种通信方式也被称为“虚电路”或“流套接字”。实现这种连接的协议就是TCP,其套接字类型为SOCK_STREAM,还有一种是无连接的,实现这种的协议是UDP,其套接字类型为SOCK_DGRAM。

TCP确保可靠性,而UDP只保证收到的数据是完整的,既不保证数据是否真的被收到,也不保证收到时的次序是否和发送时一样。但是TCP要建立和关闭连接,而UDP却不需要,比较节省时间。

用TCP的情况:需要一个可靠得得传输,保证数据完整无缺地到达目的地;协议需要不止一个请求和服务器的回答;要发送较多的数据;初始连接出现短暂延迟可以容忍。

用UDP的情况:不太关心信息包是否到达或不太在意信息包到达的顺序是否正确;协议只包括基本请求和回答;需尽快建立网络会话;只传送很少一部分数据,通常只用UDP传送1KB一下数据。

socket对象不支持文件和文件类对象接口,但Python提供一个makefile函数来生成文件类对象。格式:makefile([mode[,buf]])。mode,buf和open函数一样,buf主要用在磁盘文件,对于交互式的网络程序,可能会阻碍程序运行,最好设置为0.