Python 网络编程

概念

核心定义

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

关键术语

  • IP 地址 :计算机在网络中的唯一标识(如 192.168.1.100)分 IPv4/IPv6
  • 端口 :一台计算机上应用程序的唯一标识(范围 0~65535)1024 以下为系统保留端口
  • 协议 :通信双方约定的规则,常用 TCP 、UDP
  • 套接字(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
相关推荐
weixin_460443564 小时前
2026年新修订《网络安全法》实施:Java私有化考试系统如何做好SBOM、漏洞治理与安全升级?
java·开发语言·在线考试系统·企业培训考试系统·宏远培训考试系统·国企培训考试系统·国产化培训系统
kobe_OKOK_6 小时前
__getattr__和__getattribute__如何用
python
全栈弄潮儿7 小时前
Python实战第2期: 变量与数据类型
后端·python·agent
长沙三为智能科技7 小时前
家政小程序门店运营模块设计:会员、下单、派单、结算四段链路的落地拆解
python·小程序·内容运营
Cc.Y7 小时前
Java零基础入门:可变字符串与包装类:StringBuilder、StringBuffer 与 通讯录管理系统实战
java·开发语言·python
启观川8 小时前
数据结构与算法 -第 3 章 常用算法-动态规划
数据结构·笔记·python·算法
码爸8 小时前
排序算法介绍
python·算法·排序算法
阿森_dev8 小时前
2027 届毕设选题怎么选:30 个 Java 方向选题的实现难度排序
java·开发语言·spring boot·毕业设计·课程设计
通信大模型8 小时前
IEEE TCCN | 面向低空经济网络的Agentic AI驱动多无人机轨迹优化
网络·人工智能·无人机
by209998 小时前
C++ 多态:同一个基类接口,调用不同的函数
开发语言·c++·经验分享·多态