python2.x/python3.x 对于网络编程的支持都是非常友好的,本身支持两部分非常有用的网络编程方式
- 传统网络编程
- 非阻塞异步网络编程
1、socket的由来
socket 是一种计算机网络数据结构,中文译名:套接字
socket 最初是为同一主机上的应用程序创建,是的主机上运行的一个程序与另一个程序之间可以完成数据通信操作,程序也称为进程,就出现了不同进程间进行数据交互的操作,因为交互的模式不同,所以也一般将程序中的套接字区分为两种
- 面向文件的套接字:通过文件进行数据交互
- 面向网络的套接字:通过网络进行数据交互
套接字最初出现之后,为了区分不同平台不同体系的套接字模型对象,定义了地址家族的概念:Adress Family,也经常简写为 AF。
Unix 系统中的套接字就是第一种家族套接字,称为 AF_UNIX,或者 AF_LOCAL,这是 POSIX1标准中规范的。
同样也有一些体系平台下,对于套接字的划分通过协议家族(Protocal Family)进行规范,可以简写为 PF,考虑到兼容性的要求,PF 和AF 在一些平台上都集成了互相兼容的实现,我们的 python 本身支持的是更加标准化的 AF 地址家族
另一种地址家族就是面向网络的套接字模型对象了,经典的如 AF_INET 支持的是传统第四个版本的因特网协议寻址[IPv4],同时也提供了 AF_INET6 用于支持第六个版本的因特网协议寻址[IPv6]
2、PYTHON 中的套接字
在网络套接字交互过程中,出现了两种类型的套接字模型
- 面向连接的套接字模型
- 面向无连接的套接字模型
比较经典的如 TCP 端对端传输协议就是面向连接的套接字对象
比较经典的 UDP 广播协议使用的就是面向无连接的套接字对象
- 基本语法结构
socket.socket(socket_family, socket_type, protocal=0)
socket_family:socket 地址家族,AF_UNIX/AF_LOCAL 或者 AF_INET
socket_type:socket 连接类型
面向连接的(SOCK_STREAM),面向无连接的(SOCK_DGRAME)
protocal:传输协议,一般不用设置,使用默认值进行自动匹配就好
- 创建 TCP 协议的套接字 socket 对象
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- 创建 UDP 协议的套接字 socket 对象
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
- socket套接字常用操作
属性 | 描述 |
---|---|
s.bind() | 绑定(主机名称、端口)到一个套接字上 |
s.listen() | 设置并启动TCP监听 |
s.accept() | 等待客户链接 |
s.connect() | 连接指定服务器 |
s.connect_ex() | 连接指定服务器,如果出错返回错误信息 |
s.recv() | 接受TCP消息 |
s.recv_into() | 接受TCP消息到缓冲池 |
s.send() | 发送TCP消息 |
s.sendall() | 完整发送TCP消息 |
s.recvfrom() | 接受 UDP消息 |
s.recvfrom_into() | 接受 UDP 消息到缓冲区 |
s.sendto() | 发送 UDP 消息 |
s.shutdown() | 关闭连接对象 |
s.close() | 关闭套接字对象 |