前言
网络编程就是两台计算机通过网络进行数据通信,底层依托Socket(套接字)。TCP和UDP是传输层最核心的两种协议。
- TCP:面向连接、可靠、有序,有握手和重传,适合文件传输、网页、聊天
- UDP:无连接、不可靠、速度快,没有连接建立过程,适合直播、语音、广播
Python使用内置socket模块完成网络编程,不需要额外安装。
TCP
TCP是面向连接的协议,通信流程:服务端先监听端口 → 客户端发起连接 → 建立连接后双向收发数据 → 通信结束关闭连接。
TCP服务端
import socket
# 创建socket,AF_INET ipv4,SOCK_STREAM代表TCP
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定地址和端口
s.bind(('127.0.0.1', 9999))
# 开始监听,参数是等待连接队列最大数量
s.listen(5)
print("TCP服务端启动,等待客户端连接...")
while True:
# 阻塞等待客户端接入,返回新socket连接对象、客户端地址
conn, addr = s.accept()
print(f"收到客户端连接:{addr}")
with conn:
while True:
# recv接收数据,缓冲区大小1024字节
data = conn.recv(1024)
if not data:
break
print(f"收到消息:{data.decode('utf-8')}")
# 回发数据
conn.sendall(b"server receive: " + data)
TCP客户端
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务端
s.connect(('127.0.0.1', 9999))
# 发送数据
s.sendall(b"Hello TCP")
# 接收返回
data = s.recv(1024)
print(data.decode("utf-8"))
s.close()
重点:TCP是流协议,数据没有边界,会出现粘包问题;
recv不一定一次收到对方一次sendall发送的全部内容。
UDP
UDP是无连接协议,不用建立连接,直接发包,每个数据包独立。不需要listen()、accept()。 适合对实时性要求高、可以丢包的场景,比如视频直播、游戏。
UDP服务端
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(('127.0.0.1', 8888))
print("UDP服务端启动...")
while True:
# recvfrom同时拿到数据和发送方地址
data, addr = s.recvfrom(1024)
print(f"来自{addr}:{data.decode('utf-8')}")
s.sendto(b"udp received", addr)
UDP客户端
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 直接发送,不需要connect
s.sendto(b"Hello UDP", ('127.0.0.1', 8888))
data, addr = s.recvfrom(1024)
print(data.decode("utf-8"))
s.close()
TCP与UDP对比
| 对比项 | TCP | UDP |
|---|---|---|
| 连接 | 面向连接,三次握手建立连接 | 无连接,直接发数据包 |
| 可靠性 | 可靠传输,丢包自动重传,有序 | 不可靠,不重传,可能丢包、乱序 |
| 速度 | 较慢,开销大 | 快,开销极小 |
| 边界 | 字节流,无消息边界,存在粘包 | 数据报,每个包是独立消息 |
| 典型场景 | HTTP、文件上传、数据库、SSH | 语音通话、直播、游戏、DNS |
补充知识点
127.0.0.1是本机回环地址,只能本机访问;如果要局域网其他机器访问,绑定0.0.0.0;- 端口范围:0~65535,小于1024是系统保留端口;
- socket收发都是bytes字节,字符串必须
encode(),收到数据要decode(); - TCP服务端上面示例是单连接串行处理;并发需要多进程/多线程。
小结
- TCP:SOCK_STREAM,有连接、可靠,流程 bind -> listen -> accept -> recv/send;
- UDP:SOCK_DGRAM,无连接,使用 recvfrom / sendto;
- TCP保证数据送达,UDP追求速度;根据业务场景选择协议。