Python 网络编程

概念

核心定义

网络编程:让不同计算机 通过网络协议实现数据通信(传输 / 接收)的编程方式 Python 提供内置库 socket(套接字)是网络编程的核心工具 封装了底层网络通信细节

关键术语

  • IP 地址 :计算机在网络中的唯一标识(如 192.168.1.100)分 IPv4/IPv6
  • 端口 :一台计算机上应用程序的唯一标识(范围 0~65535)1024 以下为系统保留端口
  • 协议 :通信双方约定的规则,常用 TCPUDP
  • 套接字(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
相关推荐
小樱花的樱花2 小时前
打造高效记事本:UI设计到功能实现
开发语言·c++·qt·ui
一只小鱼儿吖2 小时前
长效代理IP:构建稳定高效的网络数据通
网络·网络协议·tcp/ip
啦啦啦_99992 小时前
1. 面向对象基础
python
橘子编程2 小时前
MindOS:你的AI第二大脑知识库
java·开发语言·人工智能·计算机网络·ai
aini_lovee2 小时前
C# 快速搜索磁盘文件解决方案
开发语言·c#
小陈工2 小时前
2026年4月8日技术资讯洞察:边缘AI推理框架竞争白热化,Python后端开发者的机遇与挑战
开发语言·数据库·人工智能·python·微服务·回归
赵药师2 小时前
YOLO中task.py改复杂的模块
python·深度学习·yolo
零二年的冬2 小时前
epoll详解
java·linux·开发语言·c++·链表
大飞记Python2 小时前
【2026更新】Python基础学习指南(AI版)——03内置函数
人工智能·python