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
相关推荐
编码者卢布14 小时前
【Azure Service Bus】Azure Service Bus Java SDK 中 Token 刷新异常的排查思路
java·python·azure
兰令水14 小时前
topcode【随机算法题】【2026.5.20打卡-java版本】
java·开发语言·算法
liuyunshengsir14 小时前
PyTorch 最小模型转 ONNX 完整样例
人工智能·pytorch·python
z2023050814 小时前
RDMA之RoCEv2 无损网络PFC 、DCQCN 和ECN (7)
linux·服务器·网络·人工智能·ai
我还记得那天14 小时前
C语言递归实现汉诺塔问题
c语言·开发语言
不吃土豆的马铃薯14 小时前
Spdlog 入门:日志记录器与日志槽基础详解
服务器·开发语言·c++·c·日志·spdlog
凯瑟琳.奥古斯特15 小时前
传输层核心功能解析
开发语言·网络·职场和发展
我星期八休息15 小时前
Linux系统编程—库制作与原理
linux·运维·服务器·数据结构·人工智能·python·散列表
Cloud_Shy61815 小时前
Python 数据分析基础入门:《Excel Python:飞速搞定数据分析与处理》学习笔记系列(第十二章 用户定义函数 上篇)
python·数据分析·excel·pandas
Fuyo_111915 小时前
C++中的活字印刷术——模板·初阶
开发语言·c++·笔记