Python网络编程深度解析

目录

一、网络编程概述

二、TCP与UDP协议详解

1.TCP协议:可靠传输的基石

2.UDP协议:高效但不可靠的传输

3. TCP与UDP对比

三、Socket编程模型

1. Socket基础

2.TCP服务器实现详解

3. UDP服务器实现详解

四、进阶应用:简易聊天程序

1. TCP聊天程序设计

五、 网络编程中的常见问题与解决方案

1. 粘包问题(TCP)

2.数据编码问题

3.超时与重连

六、 总结与扩展学习

1.核心知识点回顾

2.扩展方向


一、网络编程概述

随着互联网技术的飞速发展,网络编程已成为现代软件开发的核心技能之一。Python凭借其简洁的语法和丰富的库支持,成为网络编程的理想工具。本章将系统解析Python网络编程的核心概念,涵盖TCP与UDP协议、Socket编程模型、客户端与服务器实现,并通过一个简易聊天应用案例展示实际开发流程。


二、TCP与UDP协议详解

1.TCP协议:可靠传输的基石

核心特性:

  • 面向连接:通信双方需通过三次握手建立连接(SYN——SYN-ACK——ACK),确保通信通道可靠。
  • 可靠性:通过序列号、确认应答(ACK)、超时重传机制保证数据完整传输。
  • 流量控制:滑动窗口技术动态调整发送速率,避免接收方缓冲溢出。
  • 有序性:接收方按数据包序列号重新组装,确保数据顺序正确。

适用场景:

  • 文件传输(如FTP)、电子邮件(SMTP/POP3)、Web请求(HTTP/HTTPS)。

代码示例:

# TCP客户端
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('127.0.0.1', 12345))
client_socket.send(b'Hello, Server')
response = client_socket.recv(1024)
client_socket.close()

2.UDP协议:高效但不可靠的传输

核心特性:

  • 无连接:直接发送数据包,无需握手过程,降低延迟。
  • 不可靠性:不保证数据包到达顺序或完整性,可能发生丢包或重复。
  • 高效性:协议头仅8字节(TCP为20字节),传输开销小。
  • 支持广播/多播:可同时向多个接收方发送数据。

适用场景:

  • 实时音视频传输(如Zoom、在线游戏)、DNS查询、物联网传感器数据上报。

代码示例:

# UDP客户端
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
client_socket.sendto(b'Hello, UDP Server', ('127.0.0.1', 12345))
response, addr = client_socket.recvfrom(1024)
client_socket.close()

3. TCP与UDP对比

特性TCPUDP
连接方式面向连接无连接
可靠性高(数据重传、校验)低(可能丢包)
传输速度较慢(握手、流量控制)较快(无额外控制机制)
数据顺序严格保证不保证
适用场景文件传输、Web服务实时通信、广播

三、Socket编程模型

1. Socket基础

Socket是网络通信的抽象接口,封装了底层协议的复杂性。Python的socket模块支持IPv4(AF_INET)、IPv6(AF_INET6)和两种协议类型:

  • SOCK_STREAM:TCP协议,提供双向字节流通信。
  • SOCK_DGRAM:UDP协议,以数据报形式传输。

核心操作流程:

  1. 创建Socket对象:指定地址族和协议类型。
  2. 绑定地址(服务器端):bind((IP,Port))
  3. 监听连接(TCP服务器):listen(backlog)。
  4. 建立连接(TCP客户端):connect()。
  5. 发送/接收数据:send()/recv()(TCP)或sendto()/recvfrom()(UDP)。
  6. 关闭连接:close()。

2.TCP服务器实现详解

代码示例:

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('127.0.0.1', 12345))
server_socket.listen(5)  # 最大连接数5
while True:client_socket, addr = server_socket.accept()  # 阻塞等待连接data = client_socket.recv(1024)client_socket.send(b'Response')client_socket.close()

关键点:

  • accept()方法阻塞线程,直到有新连接到达。
  • 服务器需循环处理多个客户端请求(可通过多线程优化)。

3. UDP服务器实现详解

代码示例:

server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_socket.bind(('127.0.0.1', 12345))
while True:data, addr = server_socket.recvfrom(1024)  # 接收数据及客户端地址server_socket.sendto(b'Response', addr)    # 直接响应客户端地址

关键点:

  • UDP无需维护连接状态,每个数据包独立处理。
  • recvfrom()返回数据及发送方地址,用于响应。

四、进阶应用:简易聊天程序

1. TCP聊天程序设计

功能需求:

  • 客户端发送消息至服务器,服务器返回响应。
  • 输入 exit退出程序。

客户端代码:

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('127.0.0.1', 12345))
while True:msg = input('You: ')if msg == 'exit': breakclient_socket.send(msg.encode())response = client_socket.recv(1024)print('Server:', response.decode())
client_socket.close()

服务器代码:

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('127.0.0.1', 12345))
server_socket.listen(5)
client_socket, addr = server_socket.accept()
while True:data = client_socket.recv(1024)if not data: breakprint('Client:', data.decode())response = input('You: ')client_socket.send(response.encode())
client_socket.close()

优化方向:

  • 支持多客户端并发(使用 threading模块)。
  • 添加异常处理(如连接中断、超时)。

五、 网络编程中的常见问题与解决方案

1. 粘包问题(TCP)

原因:TCP是流式协议,多次 send()的数据可能被合并接收。

解决方案:

  • 固定消息长度(如每个消息固定为4KB)。
  • 添加消息头标识数据长度。

2.数据编码问题

核心原则:发送端编码(encode()),接收端解码(decode())。

推荐实践:统一使用UTF-8编码,避免乱码。

3.超时与重连

实现方法:

client_socket.settimeout(10)  # 设置超时时间10秒
try:data = client_socket.recv(1024)
except socket.timeout:print("Timeout, reconnecting...")

六、 总结与扩展学习

1.核心知识点回顾

  • 协议选择:根据场景权衡可靠性与实时性。
  • Socket编程模型:TCP需建立连接,UDP直接发送数据报。
  • 编码规范:统一字符编码,处理异常情况。

2.扩展方向

  • 异步网络编程:使用 asyncio 库实现高性能服务器。
  • 协议扩展:基于HTTP/WebSocket构建Web应用。
  • 网络安全:添加SSL/TLS加密(如ssl模块)。

通过本章学习,读者可掌握Python网络编程的核心技能,并具备开发基础网络应用的能力。建议结合实际项目进一步实践,探索更复杂的网络架构与协议实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/news/907083.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ElasticSearch导读

ElasticSearch 简介:ElasticSearch简称ES是一个开源的分布式搜素和数据分析引擎。是使用Java开发并且是当前最流行的开源的企业级搜索引擎,能够达到近实时搜索,它专门设计用于处理大规模的文本数据和实现高性能的全文搜索。它基于 Apache Luc…

【后端高阶面经:数据库篇】18、分布式事务:如何在分库分表中实现高性能与一致性?

一、分布式事务核心挑战:分库分表下的一致性困境 在分布式系统架构中,分库分表通过将数据分散存储提升了扩展性和性能,但却打破了传统单库事务的边界,使得分布式事务成为保障数据一致性的核心难题。其挑战主要体现在以下三方面: 1.1 ACID特性的分布式撕裂 原子性(Atomi…

Tailwind css实战,基于Kooboo构建AI对话框页面(一)

在当今数字化时代,AI 助手已成为网站和应用不可或缺的一部分。本文将带你一步步使用 Tailwind CSS 和 Kooboo 构建一个现代化的 AI 对话界面框。 一、选择 Kooboo平台 的核心优势 智能提示:在输入 class 属性时,会自动触发 Tailwind CSS 规则…

python学习day2:进制+码制+逻辑运算符

进制 Python 中的进制表示与转换 进制的基本概念 二进制、八进制、十进制、十六进制的定义与特点不同进制在计算机科学中的应用场景 Python 中的进制表示 二进制表示:使用 0b 前缀八进制表示:使用 0o 前缀十六进制表示:使用 0x 前缀示例…

ROS2学习(11)------ROS2通信接口

操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 ROS版本:2 ROS 2 提供了多种通信接口,用于节点之间的数据交换。这些接口主要包括话题(Topics)、服务(Services)、动作&…

STM32G0xx基于串口(UART)Ymodem协议实现OTA升级包括Bootloader、上位机、应用程序

STM32G0xx基于串口Ymodem协议实现OTA升级包括Bootloader、上位机、应用程序 例程说明一、串口相关的底层配置二、OTA相关的应用层三、Flash相关的操作四、Flash存储参数相关五、核心部分Ymodem相关六、其他宏配置七、主函数八、使用Python合并文件九、测试结果有疑问欢迎加交流…

Jenkins实践(6):配置“构建历史的显示名称,加上包名等信息“

Jenkins实践(6):配置“构建历史的显示名称,加上包名等信息“ 版本:Jenkins 4.262.2 需求:想要在构建历史中展示,本次运行的是哪个版本或哪个包 操作步骤: 1、先安装插件Build Name and Description Setter 2、Set Build Name 3、构建历史处查看展示 插件特性说明 安装依赖…

快速解决azure aks aad身份和权限问题

现状分析 AKS cluster 1.31.8启用aad 身份验证和kubernetes RBAC 当尝试执行kubectl get node命令时,系统返回以下错误信息: Error from server (Forbidden): nodes is forbidden: User "357517e8-4df5-4daa-88b4-94a84d763ec5" cannot list…

【玩转腾讯混元大模型】腾讯混元大模型AIGC系列产品深度体验

【玩转腾讯混元大模型】腾讯混元大模型AIGC系列产品深度体验 腾讯推出的系列AI产品:混元大模型、大模型图像创作引擎、大模型视频创作引擎、腾讯元宝,共同构成了一个强大的AI生态系统;凭借腾讯自研的大规模预训练技术和先进的自然语言处理、计…

(自用)Java学习-5.13(Redis,OSS)

核心功能实现 1. 类别导航动态加载 前端实现&#xff1a; // 加载一级分类 $.ajax({url: /category/showFirstMenu?pid0,success: function(resp) {resp.forEach(item > {$(".index-menu").append(<li onmouseover"showSecondMenu(${item.id})">…

2025电工杯A题电工杯数学建模思路代码文章教学:光伏电站发电功率日前预测问题

完整内容请看文章最下面的推广群 已更新数据、思路和模型 问题1&#xff1a;基于历史功率的光伏电站发电特性分析 建模与求解思路&#xff1a; 首先&#xff0c;需要收集光伏电站的历史发电功率数据、地理位置信息&#xff08;经纬度、海拔、倾角等&#xff09;以及太阳辐照…

Visual Studio 调试中 PDB 与图像不匹配

Visual Studio 调试中 PDB 与图像不匹配 在使用 Visual Studio 进行本地或远程调试时&#xff0c;很多开发者会遇到 PDB 加载失败、符号不匹配的问题&#xff0c;甚至程序进程未退出&#xff0c;导致 .exe 文件无法成功覆盖。本文详细解析了从后台进程清理、构建产物验证、模块…

WebRTC:实时通信的未来之路

WebRTC&#xff1a;实时通信的未来之路 目录 WebRTC&#xff1a;实时通信的未来之路一、背景介绍二、使用方式三、前途展望 一、背景介绍 随着互联网的飞速发展&#xff0c;实时音视频通信需求日益增长。传统的音视频通信多依赖于专有协议和插件&#xff08;如Flash、ActiveX等…

华为OD机试真题——猴子吃桃/爱吃蟠桃的孙悟空(2025B卷:200分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 B卷 200分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 本文收录于专栏:《2025华为OD真题目录+全流程解析/备考攻略/经验分享》 华为OD机试真题《猴子…

【Java学习笔记】单例设计模式

单例设计模式 单例模式介绍 1. 所谓类的单例设计模式&#xff0c;就是采取一定的方法保证在整个的软件系统中 &#xff08;1&#xff09;对某个类只能存在一个对象实例 &#xff08;2&#xff09;并且该类只提供一个取得对象实例的方法 2. 分类&#xff08;两种方式&#xf…

vue实例 与组件实例

vue实例 与组件实例流程图 &#x1f9e9; 基本解释 ✅ Vue 实例 Vue 实例是通过 new Vue({…}) 创建的对象&#xff0c;是整个应用的根节点。 const vm new Vue({el: #app,data: { msg: Hello Vue } });是整个应用的起点。只有一个根 Vue 实例&#xff08;通常&#xff09;…

Hive 分桶(Bucketing)深度解析:原理、实战与核心概念对比

一、分桶的意义&#xff1a;比分区更细的粒度管理 1.1 解决分区数据不均匀问题 分区的局限性&#xff1a;分区基于表外字段&#xff08;如时间字段&#xff09;划分数据&#xff0c;但可能导致部分分区数据量过大&#xff0c;部分过小&#xff0c;无法进一步细化。 分桶的定…

pytest+allure+allure-pytest 报告输出遇到的问题汇总

文章目录 前言问题一&#xff1a;module allure has no attribute severity_level问题二&#xff1a;ERROR:file or directory not found: ‐vs问题三&#xff1a;生成的 html 报告是空的&#xff0c;明明有测试用例执行完成&#xff0c;但报告没有显示数据 前言 pytestallure…

升级node@22后运行npm install报错 distutils not found

从node20升级到node22后&#xff0c;在运行 npm install 的时候报了很多 gyp 错误&#xff0c;其中包括 npm error npm error ModuleNotFoundError: No module named distutils。 问题原因是我在使用 brew install node22 的过程中自动把 python 升级到了 3.13。而 distutils …

IPD流程落地:项目任务书Charter开发

目录 简介 第一个方面&#xff0c;回答的是Why的问题。 第二点&#xff0c;要回答做什么的问题&#xff0c;也就是产品定义What的问题。 第三点就是要回答执行策略与计划的问题&#xff0c;也就是How、When、Who的问题。 第四点是对上述这些分析的总结分析&#xff0c;要为…