Python: Socket & Socketserver
Python: Socket & Socketserver 模块使用文档
起因
这是本博客的第一篇文章,由 Python 实验课学习 Socket & Socketserver 两个模块时撰写。
为什么要写这篇文章呢?
因为学完就忘官方的文档写的就是一坨- 网上找不到简明、统一的教程
模块介绍
Python 提供了两个级别访问的网络服务:
- 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统 Socket 接口的全部方法。
- 高级别的网络服务模块 SocketServer,它提供了服务器中心类,可以简化网络服务器的开发。
什么是 socket?
Socket 又称“套接字”,应用程序通常通过“套接字”向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。
socket() 函数
使用 socket()
函数创建对象:1
socket.socket([family[, type[, proto]]])
参数
family: 套接字家族可以是 AF_UNIX 或者 AF_INET
- AF_UNIX 表示 Unix 域套接字(Unix Domain Socket),用于在同一台计算机上的不同进程之间进行通信。这种套接字通过文件系统路径进行标识。使用 AF_UNIX 时,不需要指定 proto 参数,因为它通常与文件系统相关联。
- AF_INET 表示 IPv4 套接字,用于在网络上的不同计算机之间进行通信。IPv4 套接字通过 IP 地址和端口号进行标识。
type: 套接字类型可以根据是面向连接的还是非连接分为 SOCK_STREAM 或 SOCK_DGRAM
- SOCK_STREAM: 用于创建面向连接的套接字,提供可靠的、双向的、基于流的连接。这种套接字通常使用 TCP 协议,它保证数据的顺序和可靠性。
- SOCK_DGRAM: 用于创建非连接的套接字,提供不可靠的、无序的、基于数据报的连接。这种套接字通常使用 UDP 协议,它不保证数据的顺序和可靠性,但通常具有较低的延迟。
proto: 一般不填默认为 0。
Socket 对象(内建)方法
服务器端:
函数 | 描述 |
---|---|
socket.bind(address) | 绑定地址 address(host,port) 到套接字 |
socket.listen(backlog) | 开始 TCP 监听。backlog 指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为 1,通常为 5 |
socket.accept() | 被动接受 TCP 客户端连接,(阻塞式)等待连接的到来 |
客户端:
函数 | 描述 |
---|---|
socket.connect(address) | 主动初始化 TCP 服务器连接,如果连接出错,返回 socket.error 错误 |
socket.connect_ex(address) | connect() 函数的扩展版本,出错时返回出错码,而不是抛出异常 |
公共用途:
函数 | 描述 |
---|---|
socket.recv(bufsize) | 接收 TCP 数据,数据以字符串形式返回。bufsize 指定要接收的最大数据量 |
socket.send(bytes) | 发送 TCP 数据,将 bytes 中的数据发送到连接的套接字,返回值是要发送的字节数量 |
socket.sendall(bytes) | 完整发送 TCP 数据,在返回之前会尝试发送所有数据;成功返回 None,失败则抛出异常 |
socket.recvfrom(bufsize) | 接收 TCP 数据,数据以 (data, address) 形式返回 |
socket.sendto(bytes, address) | 发送 UDP 数据,将数据发送到套接字,指定远程地址,返回值是发送的字节数 |
socket.close() | 关闭套接字 |