概念
核心定义
网络编程:让不同计算机 通过网络协议实现数据通信(传输 / 接收)的编程方式 Python 提供内置库 socket(套接字)是网络编程的核心工具 封装了底层网络通信细节
关键术语
- IP 地址 :计算机在网络中的唯一标识(如
192.168.1.100)分 IPv4/IPv6 - 端口 :一台计算机上应用程序的唯一标识(范围 0~65535)1024 以下为系统保留端口
- 协议 :通信双方约定的规则,常用 TCP 、UDP
- 套接字(Socket) :网络通信的端点,相当于 "通信接口",程序通过它收发数据
TCP 与 UDP 区别
| 特性 | TCP(传输控制协议) | UDP(用户数据报协议) |
|---|---|---|
| 连接方式 | 面向连接(先建立连接再通信) | 无连接(直接发送数据) |
| 可靠性 | 可靠(不丢包、不乱序、重传) | 不可靠(可能丢包、无序) |
| 速度 | 慢(需三次握手、确认机制) | 快(无额外开销) |
| 适用场景 | 文件传输、网页、邮件 | 视频通话、直播、游戏 |
socket 库核心用法
导入库
python
运行
import socket # Python 内置库,无需额外安装
创建套接字
固定语法,指定地址族和协议类型
python
运行
# TCP 套接字(SOCK_STREAM)
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# UDP 套接字(SOCK_DGRAM)
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
AF_INET:使用 IPv4 地址(最常用)SOCK_STREAM:TCP 协议;SOCK_DGRAM:UDP 协议
TCP 编程
TCP 是客户端 - 服务端(C/S) 模式 必须先启动服务端 再启动客户端
TCP服务端
核心步骤:创建套接字 → 绑定 IP 和端口 → 监听连接 → 接受连接 → 收发数据 → 关闭连接
python
运行
import socket
# 1. 创建 TCP 套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2. 绑定 IP 和端口(空字符串代表本机所有 IP)
server_socket.bind(("", 8888)) # 端口自定义,如 8888
# 3. 开启监听(参数=最大等待连接数)
server_socket.listen(5)
print("TCP 服务端已启动,等待客户端连接...")
# 4. 接受客户端连接(阻塞:直到有客户端连接)
client_socket, client_addr = server_socket.accept()
print(f"客户端 {client_addr} 已连接")
# 5. 收发数据
while True:
# 接收数据(1024=一次最大接收字节数)
recv_data = client_socket.recv(1024)
# 客户端断开连接时,recv 会返回空字节
if not recv_data:
print("客户端已断开连接")
break
# 字节转字符串(解码)
print(f"收到客户端消息:{recv_data.decode('utf-8')}")
# 发送数据(字符串转字节,编码)
send_msg = "服务端已收到消息"
client_socket.send(send_msg.encode("utf-8"))
# 6. 关闭套接字
client_socket.close()
server_socket.close()
TCP 客户端
核心步骤:创建套接字 → 连接服务端 → 收发数据 → 关闭连接
python
运行
import socket
# 1. 创建 TCP 套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2. 连接服务端(IP+端口)
server_ip = "127.0.0.1" # 本机测试用回环地址
server_port = 8888
client_socket.connect((server_ip, server_port))
# 3. 收发数据
while True:
# 发送数据
send_msg = input("请输入要发送的消息:")
client_socket.send(send_msg.encode("utf-8"))
# 接收数据
recv_data = client_socket.recv(1024)
print(f"收到服务端消息:{recv_data.decode('utf-8')}")
# 退出条件
if send_msg == "exit":
break
# 4. 关闭套接字
client_socket.close()
TCP 关键说明
- 阻塞模式 :
accept()、recv()会阻塞程序,直到有事件触发 - 编码 / 解码 :网络传输只能传字节(bytes) 字符串需用
encode()编码,接收后用decode()解码 - 三次握手 / 四次挥手:TCP 底层自动完成,无需手动编写
UDP 编程
UDP 无连接,不需要先建立连接,服务端无需监听,直接收发数据
UDP 接收端
python
运行
import socket
# 1. 创建 UDP 套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2. 绑定 IP 和端口
udp_socket.bind(("", 9999))
print("UDP 接收端已启动,等待数据...")
# 3. 循环接收数据
while True:
# 接收数据(返回:数据,发送方地址)
recv_data, client_addr = udp_socket.recvfrom(1024)
print(f"收到 {client_addr} 消息:{recv_data.decode('utf-8')}")
# 回复数据
send_msg = "UDP 接收成功"
udp_socket.sendto(send_msg.encode("utf-8"), client_addr)
UDP 发送端
python
运行
import socket
# 1. 创建 UDP 套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2. 目标服务端地址
server_addr = ("127.0.0.1", 9999)
# 3. 发送数据
while True:
send_msg = input("请输入消息:")
udp_socket.sendto(send_msg.encode("utf-8"), server_addr)
# 接收回复
recv_data, _ = udp_socket.recvfrom(1024)
print(f"收到回复:{recv_data.decode('utf-8')}")
if send_msg == "exit":
break
# 4. 关闭套接字
udp_socket.close()
UDP 关键说明
- 无连接:发送端直接发数据,无需
connect() - 不可靠:不保证数据一定送达,适合对速度要求高的场景
常用方法总结
表格
| 方法 | 作用 | 适用协议 |
|---|---|---|
socket.bind(addr) |
绑定 IP 和端口 | TCP/UDP |
socket.listen(n) |
开启监听,设置最大等待连接数 | TCP |
socket.accept() |
接受客户端连接,返回新套接字 + 地址 | TCP |
socket.connect(addr) |
主动连接服务端 | TCP |
socket.send(data) |
发送数据(TCP 专用) | TCP |
socket.recv(n) |
接收数据(TCP 专用) | TCP |
socket.sendto(data, addr) |
发送数据(UDP 专用,带目标地址) | UDP |
socket.recvfrom(n) |
接收数据(UDP 专用,返回数据 + 地址) | UDP |
socket.close() |
关闭套接字 | TCP/UDP |