Python 网络编程
定义:Socket 是网络通信的端点,用于不同主机或同一主机的进程间通信。核心要素地址族AF_INET(IPv4)、AF_INET6(IPv6)。协议类型(TCP)、SOCK_DGRAM(UDP)。通信流程服务器:创建 Socket → 绑定 IP 和端口 → 监听连接 → 接受连接 → 收发数据。客户端:创建 Socket → 连接服务器 → 收发数据。
目录
一、网络基础
网络编程是指通过计算机网络进行信息交换与通信的技术,网络通信依赖于网络协议,网络协议规定了数据传输的格式、方法以及数据交互的规则。最常见的通信协议是TCP和UDP!。
1. TCP 协议
-
特点:
-
可靠传输:通过三次握手建立连接,确保数据完整性和顺序。
-
面向连接:通信前需建立稳定的端到端连接。
-
流式传输:数据以字节流形式传输,自动处理分包和重组。
-
适用场景:文件传输、网页访问(HTTP)、邮件(SMTP)等需要高可靠性的场景。
-
-
核心机制:
-
三次握手:客户端与服务器确认双方收发能力。
-
流量控制:通过滑动窗口机制避免接收方缓冲区溢出。
-
拥塞控制:动态调整发送速率防止网络拥堵。
-
2. UDP 协议
-
特点:
-
无连接:无需建立连接,直接发送数据包。
-
不可靠传输:不保证数据到达顺序或是否丢失。
-
高效性:头部开销小(仅8字节),传输延迟低。
-
适用场景:实时音视频、在线游戏、DNS查询等对实时性要求高的场景。
-
-
与 TCP 对比:
特性 TCP UDP 连接方式 面向连接 无连接 可靠性 高 低 传输效率 低(握手、重传) 高 数据边界 字节流(无明确边界) 数据报(保留边界)
3. Socket 简介
-
定义:Socket 是网络通信的端点,用于不同主机或同一主机的进程间通信。
-
核心要素:
-
地址族:
AF_INET
(IPv4)、AF_INET6
(IPv6)。 -
协议类型:
SOCK_STREAM
(TCP)、SOCK_DGRAM
(UDP)。
-
-
通信流程:
-
服务器:创建 Socket → 绑定 IP 和端口 → 监听连接 → 接受连接 → 收发数据。
-
客户端:创建 Socket → 连接服务器 → 收发数据。
-
二、TCP编程
在TCP编程中,客户端和服务器之间的通信需要经过连接的建立和断开。
1. TCP 客户端示例
import socket
# 创建 TCP Socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
# 连接服务器(IP 和端口需与服务器一致)
client_socket.connect(("127.0.0.1", 8888))
# 发送数据(需编码为字节流)
client_socket.send("Hello Server!".encode("utf-8"))
# 接收响应(缓冲区大小设为 1024)
response = client_socket.recv(1024)
print("收到服务器响应:", response.decode("utf-8"))
except ConnectionRefusedError:
print("连接被拒绝,请检查服务器是否启动!")
finally:
client_socket.close() # 关闭连接
2. TCP 服务器示例
import socket
import threading
# 创建 TCP Socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 允许端口复用
# 绑定 IP 和端口
server_socket.bind(("0.0.0.0", 8888)) # 0.0.0.0 表示监听所有网络接口
server_socket.listen(5) # 设置最大等待连接数
print("服务器启动,等待客户端连接...")
def handle_client(client_socket, addr):
"""处理客户端连接"""
print(f"客户端 {addr} 已连接")
try:
while True:
data = client_socket.recv(1024) # 接收数据
if not data:
break
print(f"收到来自 {addr} 的消息:", data.decode("utf-8"))
client_socket.send("消息已收到".encode("utf-8")) # 发送响应
except ConnectionResetError:
print(f"客户端 {addr} 异常断开")
finally:
client_socket.close()
# 循环接受客户端连接
while True:
client_socket, addr = server_socket.accept() # 阻塞等待连接
# 为每个客户端创建新线程
threading.Thread(target=handle_client, args=(client_socket, addr)).start()
三、UDP 编程
最大区别技术在于UDP不需要建立连接,客户端和服务器直接发送和接受数据。
1. UDP 客户端示例
import socket
def udp_client():
#创建 UDP 客户端 socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
#发送数据
message = 'Hello, UDP Server'
client_socket.sendto (message.encode ('utf-8'), ('127.0.0.1', 12345)) # 发送数据并指定目标地址
#接收服务器响应
response, server_address = client_socket.recvfrom (1024) # 接收数据和服务器地址
print ('Received from server:', response.decode ('utf-8'))
#关闭 socket
client_socket.close()
if name == 'main':
udp_client()
2. UDP 服务器示例
import socket
def udp_server():
#创建 UDP 服务器 socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
#绑定服务器地址和端口
server_socket.bind(('127.0.0.1', 12345))
print('Server is listening...')
while True:
#接收客户端消息
message, client_address = server_socket.recvfrom (1024) # 接收数据和客户端地址
print (f'Received message: {message.decode ("utf-8")}')
#发送响应
server_socket.sendto (b'Hello, UDP Client', client_address) # 向客户端发送响应
if name == 'main':
udp_server ()
四、小案例:简易聊天应用
1. TCP 聊天客户端
import socket
host = '192.168.10.101' # 服务器IP地址
port = 12345 # 端口号
# 创建TCP套接字
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务器
s.connect((host, port))
print(f"已连接到服务器 {host}:{port}")
# 发送和接收消息
send_data = input('输入消息(输入bye结束):')
s.send(send_data.encode()) # 发送消息给服务器
while send_data != 'bye':
info = s.recv(1024).decode() # 接收服务器消息
if info:
print(f'收到服务器消息:{info}')
if info == 'bye':
break
send_data = input('输入消息(输入bye结束):')
s.send(send_data.encode()) # 发送消息给服务器
# 关闭连接
s.close()
2. TCP 聊天服务器
import socket
host = '192.168.10.101' # 服务器IP地址
port = 12345 # 端口号
# 创建TCP套接字
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定IP和端口
s.bind((host, port))
# 开始监听,最大连接数为1
s.listen(1)
print(f"服务器启动,监听地址:{host}:{port}")
print("等待客户端连接...")
# 接受客户端连接
sock, addr = s.accept()
print(f"客户端 {addr} 连接成功")
# 接收和发送消息
info = sock.recv(1024).decode() # 接收客户端消息
while info != 'bye':
if info:
print(f'收到客户端消息:{info}')
send_data = input('回复消息:')
sock.send(send_data.encode()) # 发送消息给客户端
if send_data == 'bye':
break
info = sock.recv(1024).decode() # 继续接收客户端消息
# 关闭连接
sock.close()
s.close()

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。
更多推荐
所有评论(0)