一、网络编程基础
网络编程是让程序通过网络完成数据交换的技术,核心依赖TCP 和UDP 两种协议,Python 通过内置socket模块实现网络通信。
1. TCP 协议(传输控制协议)
- 核心特点:面向连接、可靠传输、数据有序、自带流量控制
- 连接机制:三次握手建立连接,四次挥手断开连接
- 适用场景 :文件传输、邮件、网页访问等要求数据不丢失、不乱序的场景
2. UDP 协议(用户数据报协议)
- 核心特点:无连接、不可靠、传输速度快、支持广播 / 多播
- 连接机制:无需握手,直接发送数据报
- 适用场景 :在线游戏、视频通话、直播等优先实时性的场景
3. Socket(套接字)
Socket 是网络通信的抽象接口,封装了底层网络操作,Python 中两种常用类型:
AF_INET:使用 IPv4 地址SOCK_STREAM:对应 TCP 协议SOCK_DGRAM:对应 UDP 协议
二、TCP 编程(可靠连接通信)
TCP 必须先建立连接,再收发数据,最后断开连接。
1. TCP 客户端代码
python
运行
import socket
def tcp_client():
# 创建TCP套接字(IPv4 + 面向连接)
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务器(本地IP + 端口)
client.connect(('127.0.0.1', 8888))
# 发送数据(字符串转字节)
send_msg = "TCP客户端已连接"
client.send(send_msg.encode('utf-8'))
# 接收服务器数据
recv_data = client.recv(1024)
print("服务器回复:", recv_data.decode('utf-8'))
# 关闭连接
client.close()
if __name__ == '__main__':
tcp_client()
2. TCP 服务器代码
python
运行
import socket
def tcp_server():
# 创建TCP服务器套接字
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定IP和端口
server.bind(('127.0.0.1', 8888))
# 监听连接(最大等待数5)
server.listen(5)
print("TCP服务器已启动,等待客户端连接...")
while True:
# 接受客户端连接
conn, addr = server.accept()
print("新客户端连接:", addr)
# 收发数据
data = conn.recv(1024)
print("客户端消息:", data.decode('utf-8'))
conn.send(b"TCP服务器已收到消息")
# 关闭当前连接
conn.close()
if __name__ == '__main__':
tcp_server()
三、UDP 编程(无连接快速通信)
UDP不需要建立连接 ,直接通过sendto/recvfrom收发数据。
1. UDP 客户端代码
python
运行
import socket
def udp_client():
# 创建UDP套接字
client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_addr = ('127.0.0.1', 9999)
# 直接发送数据(指定目标地址)
send_msg = "UDP客户端请求"
client.sendto(send_msg.encode('utf-8'), server_addr)
# 接收数据(返回数据+发送方地址)
recv_data, addr = client.recvfrom(1024)
print("服务器回复:", recv_data.decode('utf-8'))
client.close()
if __name__ == '__main__':
udp_client()
2. UDP 服务器代码
python
运行
import socket
def udp_server():
# 创建UDP服务器套接字
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.bind(('127.0.0.1', 9999))
print("UDP服务器已启动,等待数据...")
while True:
# 接收数据+客户端地址
data, client_addr = server.recvfrom(1024)
print("客户端", client_addr, "消息:", data.decode('utf-8'))
# 回复数据
server.sendto(b"UDP服务器已收到", client_addr)
if __name__ == '__main__':
udp_server()
四、实战:简易 TCP 聊天程序
支持客户端和服务器双向实时聊天 ,输入exit退出。
1. 聊天客户端
python
运行
import socket
def chat_client():
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('127.0.0.1', 7777)) #这个地方需指定服务器的ip地址以及端口
print("已连接服务器,开始聊天(输入exit退出)")
while True:
# 发送消息
msg = input("你:")
if msg.lower() == "exit":
break
client.send(msg.encode('utf-8'))
# 接收回复
reply = client.recv(1024)
print("服务器:", reply.decode('utf-8'))
client.close()
if __name__ == '__main__':
chat_client()
2. 聊天服务器
python
运行
import socket
def chat_server():
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('127.0.0.1', 7777))
server.listen(5)
print("聊天服务器已启动,等待客户端加入...")
conn, addr = server.accept()
print("客户端", addr, "已加入")
while True:
# 接收客户端消息
data = conn.recv(1024)
if not data:
break
print("客户端:", data.decode('utf-8'))
# 服务器回复
reply = input("你:")
conn.send(reply.encode('utf-8'))
conn.close()
server.close()
if __name__ == '__main__':
chat_server()
五、补充知识点(必看)
-
编码问题 网络传输只能传字节数据 ,字符串必须用
encode('utf-8')编码,接收后用decode('utf-8')解码。 -
端口选择 推荐使用1024~65535的端口,0~1023 为系统保留端口。
-
阻塞模式 默认
recv()、accept()、connect()都是阻塞的,没数据 / 没连接会一直等待。 -
数据大小
recv(1024)表示一次最多接收 1024 字节,大数据需循环接收。 -
TCP 与 UDP 核心区别| 特性 | TCP | UDP ||--------------|--------------------|----------------------|| 连接 | 面向连接 | 无连接 || 可靠性 | 可靠,不丢包 | 不可靠,可能丢包 || 速度 | 较慢 | 快 || 适用场景 | 文件、邮件、网页 | 游戏、视频、直播 |
六、运行说明
- 先启动服务器 ,再启动客户端
- 本地测试用
127.0.0.1(本机回环地址) - 同一程序的端口必须一致,否则无法连接
- 两台设备必须在同一局域网
- 防火墙关闭或放行 8080 端口
- IP 与端口完全一致才能通信