Python 库手册:socket 网络通信模块

Python 的 socket 模块是构建网络通信程序的基础库之一,提供了对底层 BSD 套接字(Socket)接口的封装,使开发者能方便地构建客户端与服务器,实现 TCP、UDP 等协议的数据通信。

常见应用场景:

(1)构建 TCP 服务器或客户端,实现双向通信。

(2)构建 UDP 服务器或客户端,适合无连接快速通信。

(3)远程控制、即时聊天、在线游戏、数据采集等场景。

(4)构建底层 HTTP、FTP、SMTP 等协议的自定义实现。

(5)网络工具开发,如端口扫描器、Ping 模拟器等。

  ◆  ◆

核心概念

1、Socket(套接字) 是网络通信的端点,由 IP 地址和端口号唯一确定。

2、套接字分为流式套接字(TCP)和数据报套接字(UDP)。

3、Python 中使用 socket.socket() 创建一个套接字对象,指定地址簇(如 IPv4)和类型(TCP 或 UDP)。

4、服务器端使用 bind()、listen()、accept() 接收连接;客户端使用 connect() 建立连接。

5、数据的收发通过 send() / recv()(TCP)或 sendto() / recvfrom()(UDP)完成。

  ◆  ◆

应用举例

例 1:创建 TCP 服务器(接收连接并回送消息)

import socket
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server.bind(("localhost", 8000))server.listen()
print("等待连接中...")conn, addr = server.accept()print("连接来自:", addr)
data = conn.recv(1024)print("收到:", data.decode())
conn.sendall(b"Hello, Client!")conn.close()

说明:

编码完成后,保存文件如 server_tcp.py。然后在命令行中运行以启动本地 TCP 服务器。

python server_tcp.py

例 2:创建 TCP 客户端(连接服务器并发送消息)

import socket
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)client.connect(("localhost", 8000))client.sendall(b"Hello, Server!")response = client.recv(1024)print("服务器回复:", response.decode())client.close()

例 3:创建 UDP 服务器(接收并回复)

import socket
udp_server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)udp_server.bind(("localhost", 9000))
print("UDP 服务器等待消息...")data, addr = udp_server.recvfrom(1024)print("来自", addr, "的数据:", data.decode())
udp_server.sendto(b"Pong", addr)udp_server.close()

例 4:创建 UDP 客户端(无需连接,直接发送)

import socket
udp_client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)udp_client.sendto(b"Ping", ("localhost", 9000))data, addr = udp_client.recvfrom(1024)print("收到回复:", data.decode())udp_client.close()

例 5:获取本机主机名与 IP 地址

import socket
hostname = socket.gethostname()ip_address = socket.gethostbyname(hostname)
print("主机名:", hostname)print("IP 地址:", ip_address)

  ◆  ◆

常用函数速览

socket.accept()

用于 TCP 服务器中,接收客户端的连接请求。

参数:无(但需在 listen() 后使用)

返回:

返回 (conn, address) 元组,其中 conn 是与客户端通信的新 socket 对象,address 是客户端地址(IP, port)

socket.bind(address)

将 socket 绑定到本地地址和端口,通常用于服务器端。

参数:

address:元组 (host, port),如 ("localhost", 8080)

返回:无

socket.close()

关闭 socket 连接,释放资源。

参数:无

返回:无

socket.connect(address)

用于客户端 socket,连接到服务器端。

参数:

address:元组 (host, port),如 ("example.com", 80)

返回:无

socket.gethostbyname(hostname)

将主机名解析为 IPv4 地址。

参数:

hostname:主机名字符串,如 "localhost" 或 "www.example.com"

返回:字符串 IP 地址,如 "127.0.0.1"

socket.gethostname()

获取当前设备的主机名。

参数:无

返回:字符串主机名,如 "My-PC"

socket.listen(backlog)

设置 TCP socket 为监听模式,准备接收连接。

参数:

backlog:连接队列的最大长度(如 5)

返回:无

socket.recv(bufsize)

从已连接的 TCP socket 中接收数据。

参数:

bufsize:最大接收的字节数(如 1024)

返回:接收到的字节数据 bytes 类型

socket.recvfrom(bufsize)

从 UDP socket 中接收数据和发送方地址。

参数:

bufsize:最大接收字节数(如 1024)

返回:

元组 (data, address)

data:接收到的字节数据

address:发送方的地址元组 (ip, port)

socket.send(data)

向 TCP 连接发送数据。

参数:

data:字节类型的数据(bytes)

返回:实际发送的字节数

socket.sendto(data, address)

通过 UDP socket 向指定地址发送数据。

参数:

data:字节类型的数据

address:目标地址元组 (host, port)

返回:实际发送的字节数

socket.settimeout(timeout)

为 socket 操作设置超时时间(秒)。

参数:

timeout:超时时间(浮点数,如 5.0 秒)

返回:无

socket.socket(family=AF_INET, type=SOCK_STREAM)

创建一个 socket 对象。

参数:

family:地址族,如 AF_INET(IPv4)或 AF_INET6

type:协议类型,如 SOCK_STREAM(TCP)或 SOCK_DGRAM(UDP)

返回:socket 对象实例

  ◆  ◆

补充说明

1、socket 是构建自定义网络协议的核心模块。

2、实际网络编程时,应考虑异常处理、超时机制(如 settimeout())。

3、发送的数据建议为 bytes 类型,文本请先 .encode()。

4、如果需求更复杂,可考虑使用 asyncio 或 select 进行并发处理。

5、若需构建 HTTP 等协议的客户端,推荐使用高级库如 requests 或 http.client。

图片

“点赞有美意,赞赏是鼓励”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值