【卷二】网络编程 一

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

posted @ 2016-08-25 20:11  坏小孩D_R  阅读(259)  评论(0编辑  收藏  举报