当前位置: 首页 > news >正文

【Python socket模块深度解析】网络通信的核心工具

目录

    • 🌟 模块概述
      • 🧬 模块定位
      • 📦 导入方式
    • 🛠️ 核心API详解
      • 1️⃣ socket对象创建
      • 2️⃣ 关键方法速查
    • 🔌 TCP/UDP编程流程对比
      • 🚥 TCP通信流程
      • 🚀 UDP通信流程
    • 💻 实战代码示例
      • 案例1:TCP文件传输服务器
      • 案例2:UDP时间客户端
    • ⚠️ 常见错误处理
      • 1️⃣ 地址已在使用(Address already in use)
      • 2️⃣ 连接重置(Connection reset)
      • 3️⃣ 超时控制
    • 🚀 高级技巧
      • 1️⃣ 获取本机IP
      • 2️⃣ 端口扫描工具
    • 📚 学习资源推荐


🌟 模块概述

🧬 模块定位

socket模块是Python标准库中用于网络通信的核心模块,提供对BSD套接字接口的面向对象封装,支持TCP/IP、UDP等协议栈。

📦 导入方式

import socket  # 标准导入
from socket import socket, AF_INET, SOCK_STREAM  # 按需导入

🛠️ 核心API详解

1️⃣ socket对象创建

socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)
  • 参数说明
    • family:地址族(默认AF_INET=IPv4,可选AF_INET6=IPv6)
    • type:套接字类型(SOCK_STREAM=TCP,SOCK_DGRAM=UDP)
    • proto:协议号(通常自动检测)
    • fileno:文件描述符(高级用法)

2️⃣ 关键方法速查

方法适用协议作用描述
bind((host, port))TCP/UDP绑定地址到套接字
listen(backlog)TCP启动监听,设置等待队列长度
accept()TCP接受客户端连接,返回(client_socket, address)
connect((host, port))TCP连接服务端
send(data)TCP发送数据
recv(bufsize)TCP接收数据
sendto(data, addr)UDP发送数据到指定地址
recvfrom(bufsize)UDP接收数据和发送方地址
close()通用关闭套接字

🔌 TCP/UDP编程流程对比

🚥 TCP通信流程

服务器
创建socket
bind绑定
listen监听
accept接受连接
recv/send数据交换
close关闭
客户端
创建socket
connect连接
send/recv数据交换
close关闭

🚀 UDP通信流程

服务端
创建socket
bind绑定
recvfrom接收数据
sendto发送响应
客户端
创建socket
sendto发送数据
recvfrom接收响应

💻 实战代码示例

案例1:TCP文件传输服务器

import socketdef tcp_file_server(filename, port=8888):with socket.socket() as s:s.bind(('', port))s.listen(1)print(f"等待连接,端口{port}...")conn, addr = s.accept()with conn, open(filename, 'wb') as f:print(f"客户端 {addr} 已连接")while True:data = conn.recv(4096)if not data: breakf.write(data)print("文件传输完成")tcp_file_server('received_file.zip')

案例2:UDP时间客户端

import socket
import timedef udp_time_client(server_ip='127.0.0.1', port=8888):with socket.socket(type=socket.SOCK_DGRAM) as s:for _ in range(3):s.sendto(b'time', (server_ip, port))data, addr = s.recvfrom(1024)print(f"服务器 {addr} 时间: {data.decode()}")time.sleep(1)udp_time_client()

⚠️ 常见错误处理

1️⃣ 地址已在使用(Address already in use)

s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)  # 在bind前设置

2️⃣ 连接重置(Connection reset)

try:data = conn.recv(1024)
except ConnectionResetError:print("客户端异常断开")

3️⃣ 超时控制

s.settimeout(5.0)  # 设置5秒超时
try:data = s.recv(1024)
except socket.timeout:print("接收超时")

🚀 高级技巧

1️⃣ 获取本机IP

def get_local_ip():s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)try:s.connect(('8.8.8.8', 80))  # 连接公共DNSreturn s.getsockname()[0]finally:s.close()print("本机IP:", get_local_ip())

2️⃣ 端口扫描工具

def port_scan(target_ip, start=70, end=100):open_ports = []for port in range(start, end+1):with socket.socket() as s:s.settimeout(0.5)result = s.connect_ex((target_ip, port))if result == 0:open_ports.append(port)return open_portsprint("开放端口:", port_scan('127.0.0.1', 70, 100))

📚 学习资源推荐

  1. 官方文档:socket — Low-level networking interface
  2. 经典书籍:《Python网络编程(第3版)》
  3. 调试工具
    • Wireshark(网络协议分析)
    • netcat(网络调试瑞士军刀)
    • Postman(API测试)

“Socket编程是打开网络世界的钥匙,掌握它意味着你能让任何设备对话。”
—— 网络工程师箴言

相关文章:

  • 使用pm2 部署react+nextjs项目到服务器
  • 【IC_Design】跨时钟域的寄存器更新后锁存
  • RK3588 RGA 测试
  • 解决leetcode第3548题.等和矩阵分割II
  • 推测解码算法在 MTT GPU 的应用实践
  • C++23 容器推导指引中对于分配器的非推导语境(P1518R2)
  • MCP协议:AI时代的“万能插座”,如何重塑互联网技术生态?
  • 【1004. 最大连续1的个数 III】
  • Redis进阶之高可用
  • 操作系统学习笔记第1章 操作系统概述(灰灰题库
  • SAR ADC 的常见架构
  • Spring Task
  • 结课作业自选01. 内核空间 MPU6050 体感鼠标驱动程序(二)(完整实现流程)
  • 服务器硬盘分类
  • 服务器磁盘按阵列划分为哪几类
  • 【Vue】将响应式对象转为非响应式对象
  • (37)服务器增加ipv6配置方法
  • 浪潮Inspur服务器产品线概述
  • van-picker实现日期时间选择器
  • fatal error: uuid/uuid.h: No such file or directory 编译问题修复。
  • 网站开发者的常用工具/建站优化公司
  • 网站添加谷歌地图/恶意点击软件哪几种
  • 自己设计一个网站首页/google浏览器网页版
  • 网站建设犭金手指B排名14/南昌seo实用技巧
  • WordPress客服插件破解版/端点seo博客
  • 做网站陪聊下单/太原搜索排名提升