Python 提供了两个级别访问的网络服务:
(1)低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,
可以访问底层操作系统Socket接口的全部方法。
(2)高级别的网络服务模块 SocketServer, 它提供了服务器中心类,
可以简化网络服务器的开发。
一、什么是 Socket?
Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。
Python 中,我们用 socket()
函数来创建套接字,语法格式如下:
socket.socket([family[, type[, proto]]])
family: 套接字家族可以使AF_UNIX 或者 AF_INET
type: 套接字类型可以根据是面向连接的还是非连接分为 SOCK_STREAM 或 SOCK_DGRAM
protocol: 一般不填默认为0.
- 5
二、理解 AF_UNIX,AF_INET,SOCK_STREAM 和 SOCK_DGRAM
1. AF_UNIX 和 AF_INET
(1)AF_UNIX
:基于文件
(又名AF_LOCAL
,在POSIX1.g标准中指定),它代表地址家族(addressfamily):UNIX
。其他比较旧的系统可能会将地址家族表示成域(domain)或协议家族(protocolfamily),并使用其缩写PF而非AF。类似地,AF_LOCAL
(在2000~2001年标准化)将代替AF_UNIX
。
(2)AF_INET
:面向网络
或者地址家族:因特网。另一个地址家族AF_INET6
用于第6版因特网协议(IPv6)寻址。此外,还有其他的地址家族,这些要么是专业的、过时的、很少使用的,要么是仍未实现的。在所有的地址家族之中,目前 AF_INET
是使用得最广泛的
2. SOCK_STREAM 和 SOCK_DGRAM
(1)面向连接的套接字:SOCK_STREAM
TCP套接字的名字:SOCK_STREAM。
特点:可靠,开销大。
- 1
- 2
在进行通信之前必须先建立一个连接,该连接的通信提供序列化的、可靠的和不重复的数据交付,而没有记录边界。
这种类型的通信也称为虚拟电路或流套接字。实现这种连接类型的主要协议是传输控制协议(缩写 TCP)为了创建 TCP套接字,必须使用 SOCK_STREAM
作为套接字类型。
(2)无连接的套接字:SOCK_DGRAM
UDP套接字的名字SOCK_DGRAM
特点:不可靠(局网内还是比较可靠的),开销小。
- 1
- 2
与虚拟电路形成鲜明对比的是数据报类型的套接字,它是一种无连接的套接字。
在通信开始之前并不需要建立连接。此时,在数据传输过程中并无法保证它的顺序性、可靠性或重复性。数据报确实保存了记录边界,这就意味着消息是以整体发送的,而并非首先分成多个片段。
实现这种连接类型的主要协议是用户数据报协议(缩写 UDP)。为
了创建UDP套接字,必须使用SOCK_DGRAM
作为套接字类型。
UDP套接字的SOCK_DGRAM
名字来自于单词“datagram”(数据报)。