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
相关推荐
2601_967987372 分钟前
Python——入门级(定义功能def函数)
python·函数·可变参数·默认参数·关键字参数
中屹指纹浏览器svip5 分钟前
只用指纹浏览器,不搭配IP可以吗?
网络
jimmyleeee24 分钟前
Agent安全之八:OWASP ASI08 级联失效------当每一个 Agent 都“正确”,系统却走向灾难
网络·安全·web安全
缓慢更新29 分钟前
AI 辅助生成单测:从接口定义到用例的流水线
java·服务器·前端·网络·数据库·人工智能
超级架构师41 分钟前
PRAXO-CORE 2.5.0:用 conformance 和显式边界构建 Go Agent 框架
开发语言·人工智能·后端·golang·ai编程·智能体框架·praxo-core
叼烟扛炮1 小时前
Linux 学习笔记(四十一):TCP 并发演进——从单进程到多线程服务器
linux·运维·服务器·网络·笔记·学习·tcp/ip
叼烟扛炮1 小时前
Linux 学习笔记(四十三):网络编程进阶——自定义协议解决 TCP 粘包与守护进程
linux·开发语言·网络·笔记·tcp/ip
Escalating_xu2 小时前
【Linux 网络编程】DNS 与 ICMP:从域名解析到 ping、traceroute,把“网络通不通”问清楚
linux·网络·php
LMT流氓兔2 小时前
第五单元——第十六课:给书店助手加上网页界面
java·开发语言·jvm·人工智能·oracle·langchain·1024程序员节
专注仿真2 小时前
梯度提升类(XFBoost)算法详解与代码实例
开发语言·人工智能·python·算法·大模型训练·控制算法