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_STREAMSOCK_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()关闭套接字