Socket TCP 和 UDP 编程基础(Python)
网络编程是现代计算机科学的重要组成部分,而 socket
是 Python 提供的一个模块,用于实现网络通信。本文将详细介绍 TCP 和 UDP 两种通信协议的基础知识,配合 Python 代码示例和图解,让你轻松上手。
一、TCP 和 UDP 概述
1.1 TCP 协议
- 特点:面向连接、可靠传输、适合数据量大且顺序重要的场景。
- 应用:网页浏览、文件传输。
通信模型:
- 客户端发起连接。
- 服务端接受连接。
- 双方建立可靠的数据传输通道。
1.2 UDP 协议
- 特点:无连接、快速、不保证可靠传输。
- 应用:视频直播、在线游戏。
通信模型:
- 无需建立连接。
- 数据直接发送到目标。
二、Python Socket 基础
socket
模块是 Python 提供的网络通信接口,可以实现 TCP 和 UDP 通信。
2.1 常用方法
方法 | 说明 |
---|---|
socket() | 创建一个新的 socket 对象 |
bind(address) | 绑定到指定的 IP 和端口 |
listen(backlog) | 在 TCP 中监听连接 |
accept() | 接受客户端连接 |
connect(address) | 客户端连接到服务器 |
send(data) | 发送数据 |
recv(buffer_size) | 接收数据 |
sendto(data, addr) | 向指定地址发送数据(UDP) |
recvfrom(buffer_size) | 接收数据(UDP) |
close() | 关闭 socket |
三、TCP 编程
3.1 TCP 服务端代码
import socket
# 创建 TCP socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(("127.0.0.1", 65432)) # 绑定 IP 和端口
server_socket.listen(5) # 最大连接数
print("服务端已启动,等待连接...")
conn, addr = server_socket.accept() # 等待客户端连接
print(f"连接来自: {addr}")
# 接收并发送数据
data = conn.recv(1024).decode("utf-8")
print(f"收到客户端消息: {data}")
conn.send("你好,客户端!".encode("utf-8"))
# 关闭连接
conn.close()
server_socket.close()
3.2 TCP 客户端代码
import socket
# 创建 TCP socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(("127.0.0.1", 65432)) # 连接服务器
# 发送数据
client_socket.send("你好,服务端!".encode("utf-8"))
# 接收数据
data = client_socket.recv(1024).decode("utf-8")
print(f"收到服务端消息: {data}")
# 关闭连接
client_socket.close()
运行结果
服务端输出:
服务端已启动,等待连接... 连接来自: ('127.0.0.1', 50000) 收到客户端消息: 你好,服务端!
客户端输出:
收到服务端消息: 你好,客户端!
TCP 通信模型图解
客户端 服务端
| connect() |
| ----------------> |
| |
| accept() |
| <---------------- |
| |
| send() |
| ----------------> |
| |
| recv() |
| <---------------- |
| |
四、UDP 编程
4.1 UDP 服务端代码
import socket
# 创建 UDP socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_socket.bind(("127.0.0.1", 65432)) # 绑定 IP 和端口
print("UDP 服务端已启动,等待数据...")
# 接收数据
data, addr = server_socket.recvfrom(1024)
print(f"收到来自 {addr} 的消息: {data.decode('utf-8')}")
# 发送响应
server_socket.sendto("你好,客户端!".encode("utf-8"), addr)
server_socket.close()
4.2 UDP 客户端代码
import socket
# 创建 UDP socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 发送数据
client_socket.sendto("你好,服务端!".encode("utf-8"), ("127.0.0.1", 65432))
# 接收响应
data, addr = client_socket.recvfrom(1024)
print(f"收到服务端消息: {data.decode('utf-8')}")
client_socket.close()
运行结果
服务端输出:
UDP 服务端已启动,等待数据... 收到来自 ('127.0.0.1', 50000) 的消息: 你好,服务端!
客户端输出:
收到服务端消息: 你好,客户端!
UDP 通信模型图解
客户端 服务端
| sendto() |
| ----------------> |
| |
| recvfrom() |
| <---------------- |
五、TCP 与 UDP 的区别
特性 | TCP | UDP |
---|---|---|
是否连接 | 面向连接 | 无连接 |
数据可靠性 | 高,保证数据按顺序到达 | 不可靠,不保证顺序 |
速度 | 较慢,需建立连接和确认 | 快,无需连接 |
应用场景 | 文件传输、网页浏览 | 视频流、在线游戏 |
六、综合练习:多人聊天室
服务端代码
import socket
import threading
# 创建服务端
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(("127.0.0.1", 65432))
server_socket.listen(5)
clients = []
def handle_client(conn, addr):
print(f"新客户端加入: {addr}")
while True:
try:
data = conn.recv(1024).decode("utf-8")
if not data:
break
print(f"{addr}: {data}")
for client in clients:
if client != conn:
client.send(f"{addr}: {data}".encode("utf-8"))
except:
break
conn.close()
clients.remove(conn)
print("聊天室启动中...")
while True:
conn, addr = server_socket.accept()
clients.append(conn)
threading.Thread(target=handle_client, args=(conn, addr)).start()
客户端代码
import socket
import threading
def receive_messages(client_socket):
while True:
try:
message = client_socket.recv(1024).decode("utf-8")
print(message)
except:
print("连接已关闭")
break
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(("127.0.0.1", 65432))
threading.Thread(target=receive_messages, args=(client_socket,)).start()
print("加入聊天室!输入消息开始聊天...")
while True:
msg = input()
client_socket.send(msg.encode("utf-8"))
七、总结
通过本文,你应该已经掌握了 Python 中基于 socket
模块进行 TCP 和 UDP 编程的基本方法。无论是构建简单的客户端-服务端模型,还是开发复杂的网络应用,都可以从这些基础知识入手。希望你通过练习能够熟练运用这些技术!