Python核心编程——第2章网络编程笔记

说明

本篇文章只是重点知识点摘录,理解为主。详细信息请看《Python核心编程》一书,或者
Python核心编程——第2章 网络编程 笔记 by RealEmperor

客户端/服务器架构

概念

什么是客户端/服务器架构?对于不同的人来说,它意味着不同的东西,这取决于你问谁以及描述的是软件还是硬件系统。在这两种情况中的任何一种下,前提都很简单:服务器就是一系列硬件或软件,为一个或多个客户端(服务的用户)提供所需的“服务”。它存在唯一目的就是等待客户端的请求,并响应它们(提供服务),然后等待更多请求。
另一方面,客户端因特定的请求而联系服务器,并发送必要的数据,然后等待服务器的 回应,最后完成请求或给出故障的原因。服务器无限地运行下去,并不断地处理请求;而客户端会对服务进行一次性请求,然后接收该服务,最后结束它们之间的事务。客户端在一段时间后可能会再次发出其他请求,但这些都被当作不同的事务。

例子

  • 硬件客户端/服务器架构
    • 打印(打印机)服务器:处理传入的打印作业并将其发送 给系统中的打印机(或其他的打印设备)。通常可以通过网络进行访问,并且客户端计算机将向它发送打印请求。
    • 文件服务器:通常都是拥有庞大通用存储容量的计算机,可以被客户端远程访问。如Sun 公司的 网络文件系统(NFS)
  • 软件客户端/服务器架构
    • Web 服务器:接受客户端请求,并向(Web)客户端(即用户计算机上的浏览器)回送 Web 页面,然后等待下一个客户端的请求。这些服务器一旦开启,都将可能永远运行。
    • 数据库服务器。它们接受客户端的存储或检索请求,响应请求,然后等待更多的事务。
    • 窗体(window)服务器:几乎可以认为这些服务器是硬件服务器。它们运行在一台附带(外接)显示设备(如显示器)的计算机上。窗体客户端其实就是一些程序,这些程序需要一个窗口化的环境来运行。这些通常被当作图形用户界面(GUI)应用程序。

套接字: 通信端点(Communication Endpoints)

概念

套接字是计算机网络数据结构,它体现了上节中所描述的“通信端点”的概念。在任何 类型的通信开始之前,网络应用程序必须创建套接字。可以将它们比作电话插孔,没有它将 无法进行通信。

起源

套接字的起源可以追溯到 20 世纪 70 年代,它是加利福尼亚大学的伯克利版本 UNIX(称 为 BSD UNIX)的一部分。因此,有时你可能会听过将套接字称为伯克利套接字或 BSD 套接 字。套接字最初是为同一主机上的应用程序所创建,使得主机上运行的一个程序(又名一个 进程)与另一个运行的程序进行通信。这就是所谓的进程间通信(Inter Process Communication, IPC)。有两种类型的套接字:基于文件的和面向网络的。

分类

  • 基于文件的UNIX套接字
    • 族名(family name)为AF_UNIX(又名AF_LOCAL,在POSIX1.g标准中指定)。它代表地址家族(address family):UNIX。
    • 其它较旧的地址家族名称:域(domain)或协议家族(protocol family),并使用其缩写 PF 而 非 AF。
  • 基于网络
    • 家族名字 AF_INET,或者地址家族: 因特网。
    • 地址家族 AF_INET6 用于第 6 版因特网协议(IPv6)寻址。

套接字地址

主机+端口号(0~65535)

面向连接的套接字与无连接的套接字

类型 名称 提供的服务 协议
面向连接 虚拟电路或流套接字 序列化的、可靠的和不重复的数据交付,而没有记录边界。 主要协议是传输控制协议(TCP),若使用网络则要加上因特网协议(IP)来搜寻网络中的主机
无连接 数据报类型的套接字 不保证顺序性、 可靠性或重复性;记录边界;成本低廉 主要协议是用户数据报协议(UDP),若使用网络则要加上因特网协议(IP)来搜寻网络中的主机

创建TCP\UDP服务器与客户端

TCP服务器端伪代码

ss = socket()                    # 创建服务器套接字  
ss.bind()                        # 套接字与地址绑定
ss.listen()                      # 监听连接
inf_loop:                        # 服务器无限循环
	cs = ss.accept()             # 接受客户端连接
	comm_loop:                   # 通信循环
		cs.recv()/cs.send()      # 对话(接收/发送)
	cs.close()                   # 关闭客户端套接字
ss.close()                       # 关闭服务器套接字#(可选)

TCP客户端伪代码

cs = socket()                     # 创建客户端套接字 
cs.connect()                      # 尝试连接服务器
comm_loop:                        # 通信循环
	cs.send()/cs.recv()           # 对话(发送/接收) 
cs.close()                        # 关闭客户端套接字

UDP服务器伪代码

ss = socket()                           # 创建服务器套接字  
ss.bind()                               # 套接字与地址绑定
inf_loop:                               # 服务器无限循环
	cs = ss.recvfrom()/ss.sendto()      # 关闭(接收/发送)
ss.close()                              # 关闭服务器套接字

UDP客户端伪代码

cs = socket()   				# 创建客户端套接字 
comm_loop: 						# 通信循环
	cs.sendto()/cs.recvfrom()   # 对话(发送/接收) 
cs.close() 						# 关闭客户端套接字

SocketServer 模块

SocketServer是标准库中的一个高级模块(Python 3.x中重命名为socketserver)

  • 改进点
    • 简化很多样板代码,它们是创建网络客户端和服务器所必需的代码。
    • 使用类来编写应用程序。
    • 事件驱动

Twisted框架

Twisted 是一个完整的事件驱动的网络框架,利用它既能使用也能开发完整的异步网络应用程序和协议。其他异步系统有Greenlets、 Tornado、Diesel、Concurrence、Eventlet、Gevent 等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章