python中socket(套接字)库详细解析
目录
1. 前言
2. socket 库基础
2.1 什么是 socket?
2.2 socket 的类型
3. 基于 TCP 的 socket 编程
3.1 TCP 服务器端代码示例
3.2 TCP 客户端代码示例
3.3 代码分析
4. 基于 UDP 的 socket 编程
4.1 UDP 服务器端代码示例
4.2 UDP 客户端代码示例
4.3 代码分析
5. 总结
1. 前言
在 Python 开发中,socket 库是一个非常重要的工具,它允许我们进行网络编程。通过 socket,程序可以在不同的机器之间进行通信,这为我们构建分布式系统、网络服务等提供了基础。无论是开发一个简单的聊天程序,还是构建复杂的网络服务架构,socket 都是不可或缺的。本文将结合详细的 Python 代码,全面介绍 socket 库的使用方法,让你轻松掌握网络编程的核心技能。
2. socket 库基础
2.1 什么是 socket?
socket(套接字)是通信的端点,它是一个通信会话的抽象。在计算机网络中,两台计算机之间要进行通信,就需要在双方建立 socket 连接,通过这个双向通道进行数据的发送和接收。
2.2 socket 的类型
主要有两种常见的 socket 类型:
-
SOCK_STREAM :提供面向连接的、可靠的字节流服务,基于 TCP 协议。它确保数据按照顺序到达,并且在数据传输过程中不会出现重复。
-
SOCK_DGRAM :提供无连接的、不可靠的 datagram 服务,基于 UDP 协议。这种类型的数据传输不保证可靠性,数据可能会丢失或乱序到达,但它的传输速度相对较快,适用于对实时性要求较高但对数据丢失不太敏感的场景,如视频流传输。
3. 基于 TCP 的 socket 编程
3.1 TCP 服务器端代码示例
import socket# 创建 socket 对象,AF_INET 表示使用 IPv4 地址,SOCK_STREAM 表示使用 TCP 协议
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 绑定 IP 地址和端口,这里绑定本地主机的 8080 端口
server_socket.bind(("localhost", 8080))# 开始监听,监听队列长度为 5
server_socket.listen(5)
print("服务器开始监听...")# 接受客户端连接,accept() 方法会阻塞等待客户端连接
client_socket, client_address = server_socket.accept()
print(f"客户端 {client_address} 已连接")# 接收客户端发送的数据,1024 表示缓冲区大小
data = client_socket.recv(1024).decode()
print(f"接收到客户端消息:{data}")# 向客户端发送数据
response = "服务器已收到消息"
client_socket.send(response.encode())# 关闭连接
client_socket.close()
server_socket.close()
3.2 TCP 客户端代码示例
import socket# 创建 socket 对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 连接到服务器,这里连接本地主机的 8080 端口
client_socket.connect(("localhost", 8080))# 向服务器发送数据
message = "Hello, Server!"
client_socket.send(message.encode())# 接收服务器返回的数据
response = client_socket.recv(1024).decode()
print(f"收到服务器回复:{response}")# 关闭连接
client_socket.close()
3.3 代码分析
-
在服务器端,
bind()方法用于绑定 IP 地址和端口,使得服务器能够监听指定地址和端口上的连接请求。listen()方法则让服务器进入监听状态,等待客户端的连接。 -
accept()方法是一个阻塞方法,它会等待客户端的连接。当客户端连接成功后,会返回一个新的 socket 对象(用于和客户端进行通信)和客户端的地址信息。 -
客户端通过
connect()方法连接到服务器的指定 IP 地址和端口。 -
数据的发送和接收分别通过
send()和recv()方法实现,需要注意数据是以字节流的形式传输,所以在发送之前要使用encode()方法将字符串编码为字节,接收后使用decode()方法解码为字符串。
4. 基于 UDP 的 socket 编程
4.1 UDP 服务器端代码示例
import socket# 创建 socket 对象,SOCK_DGRAM 表示使用 UDP 协议
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 绑定 IP 地址和端口
server_socket.bind(("localhost", 9090))
print("UDP 服务器启动,等待客户端消息...")while True:# 接收客户端发送的数据和客户端地址data, client_address = server_socket.recvfrom(1024)print(f"收到客户端 {client_address} 的消息:{data.decode()}")# 向客户端发送数据response = "服务器已收到你的 UDP 消息"server_socket.sendto(response.encode(), client_address)# 如果收到特定消息就退出循环if data.decode() == "exit":break# 关闭 socket
server_socket.close()
4.2 UDP 客户端代码示例
import socket# 创建 socket 对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 向服务器发送数据
server_address = ("localhost", 9090)
message = "Hello, UDP Server!"
client_socket.sendto(message.encode(), server_address)# 接收服务器返回的数据
response, server_address = client_socket.recvfrom(1024)
print(f"收到服务器 {server_address} 的回复:{response.decode()}")# 再次发送消息并接收回复(测试多轮通信)
message = "This is another message"
client_socket.sendto(message.encode(), server_address)
response, server_address = client_socket.recvfrom(1024)
print(f"收到服务器回复:{response.decode()}")# 发送退出消息
client_socket.sendto("exit".encode(), server_address)# 关闭连接
client_socket.close()
4.3 代码分析
-
UDP 是无连接的,所以在服务器端不需要像 TCP 一样调用
listen()和accept()方法来建立连接,而是直接通过recvfrom()方法接收数据和客户端地址。 -
客户端通过
sendto()方法发送数据,同时指定目标服务器的地址和端口。recvfrom()方法用于接收数据和服务器的地址。 -
UDP 的这种通信方式使得数据的发送和接收相对简单,但需要注意数据的丢失和乱序问题。
5. 总结
Python 中的 socket 库是强大而灵活的网络编程工具。通过本文的介绍和代码示例,我们详细了解了基于 TCP 和 UDP 协议的 socket 编程方法。TCP 提供了可靠的面向连接的通信,适用于对数据准确性要求高的场景;UDP 则提供了简单的无连接通信,适合对实时性要求较高但对数据丢失不太敏感的场景。在实际开发中,我们可以根据具体需求选择合适的协议类型来构建网络应用,从简单的客户端 - 服务器架构到复杂的分布式系统,socket 库都能为我们提供坚实的基础。掌握 socket 编程,将为你打开网络编程世界的大门,让你能够开发出各种具有网络通信功能的应用程序。我是橙色小博,关注我,一起在人工智能领域学习进步!
相关文章:
python中socket(套接字)库详细解析
目录 1. 前言 2. socket 库基础 2.1 什么是 socket? 2.2 socket 的类型 3. 基于 TCP 的 socket 编程 3.1 TCP 服务器端代码示例 3.2 TCP 客户端代码示例 3.3 代码分析 4. 基于 UDP 的 socket 编程 4.1 UDP 服务器端代码示例 4.2 UDP 客户端代码示例 4.3…...
鸿蒙-状态管理V1和V2在ForEach循环渲染的表现
目录 前提遇到的问题换V2呗 状态管理V2已经出来好长时间了,移除GAP说明也有一段时间了,相信有一部分朋友已经开始着手从V1迁移到V2了,应该也踩了不少坑。 下面向大家分享一下我使用状态管理V1和Foreach时遇到的坑,以及状态管理V2在…...
深入了解递归、堆与栈:C#中的内存管理与函数调用
在编程中,理解如何有效地管理内存以及如何控制程序的执行流程是每个开发者必须掌握的基本概念。C#作为一种高级编程语言,其内存管理和函数调用机制包括递归、堆与栈。本文将详细讲解这三者的工作原理、用途以及它们在C#中的实现和应用。 1. 递归 (Recur…...
图论---Prim堆优化(稀疏图)
题目通常会提示数据范围: 若 V ≤ 500,两种方法均可(朴素Prim更稳)。 若 V ≤ 1e5,必须用优先队列Prim vector 存图。 #include <iostream> #include <vector> #include <queue> #include <…...
stm32之GPIO函数详解和上机实验
目录 1.LED和蜂鸣器1.1 LED1.2 蜂鸣器 2.实验2.1 库函数:RCC和GPIO2.1.1 RCC函数1. RCC_AHBPeriphClockCmd2. RCC_APB2PeriphClockCmd3. RCC_APB1PeriphClockCmd 2.1.2 GPIO函数1. GPIO_DeInit2. GPIO_AFIODeInit3. GPIO_Init4. GPIO_StructInit5. GPIO_ReadInputDa…...
用 PyQt5 和 asyncio 打造接口并发测试 GUI 工具
接口并发测试是测试工程师日常工作中的重要一环,而一个直观的 GUI 工具能有效提升工作效率和体验。本篇文章将带你用 PyQt5 和 asyncio 从零实现一个美观且功能实用的接口并发测试工具。 我们将实现以下功能: 请求方法选择器 添加了一个下拉框 QComboBo…...
OpenHarmony Camera开发指导(四):相机会话管理(ArkTS)
概述 相机在使用预览、拍照、录像、获取元数据等功能前,都需要先创建相机会话。 相机会话Session的功能如下: 配置相机的输入流和输出流。 配置输入流即添加设备输入,通俗来讲即选择某一个摄像头进行拍照录像;配置输出流&#x…...
深入探索RAG(检索增强生成)模型的优化技巧
📌 友情提示: 本文内容由银河易创AI(https://ai.eaigx.com)创作平台的gpt-4o-mini模型生成,旨在提供技术参考与灵感启发。文中观点或代码示例需结合实际情况验证,建议读者通过官方文档或实践进一步确认其准…...
Spring boot 中的IOC容器对Bean的管理
Spring Boot 中 IOC 容器对 Bean 的管理,涵盖从容器启动到 Bean 的生命周期管理的全流程。 步骤 1:理解 Spring Boot 的容器启动 Spring Boot 的 IOC 容器基于 ApplicationContext,在应用启动时自动初始化。 入口类:通过 SpringB…...
Qt实战之将自定义插件(minGW)显示到Qt Creator列表的方法
Qt以其强大的跨平台特性和丰富的功能,成为众多开发者构建图形用户界面(GUI)应用程序的首选框架。而在Qt开发的过程中,自定义插件能够极大地拓展应用程序的功能边界,让开发者实现各种独特的、个性化的交互效果。想象一下…...
【Vue】TypeScript与Vue3集成
个人主页:Guiat 归属专栏:Vue 文章目录 1. 前言2. 环境准备与基础搭建2.1. 安装 Node.js 与 npm/yarn/pnpm2.2. 创建 Vue3 TypeScript 项目2.2.1. 使用 Vue CLI2.2.2. 使用 Vite(推荐)2.2.3. 目录结构简述 3. Vue3 TS 基础语法整…...
Linux之七大难命令(The Seven Difficult Commands of Linux)
Linux之七大难命令 、背景 作为Linux的初学者,肯定要先掌握高频使用的指令,这样才能让Linux的学习在短时间内事半功倍。但是,有些指令虽然功能强大,但因参数多而让初学者们很害怕,今天介绍Linux中高频使用࿰…...
Spring Boot单元测试实战指南:从零到高效测试
在Spring Boot开发中,单元测试是保障代码质量的核心环节。本文将基于实际开发场景,手把手教你如何快速实现分层测试、模拟依赖、编写高效断言,并分享最佳实践! 一、5分钟环境搭建 添加依赖 在pom.xml中引入spring-boot-starter-te…...
5.3.1 MvvmLight以及CommunityToolkit.Mvvm介绍
MvvmLight、CommunityToolkit.Mvvm是开源包,他们为实现 MVVM(Model-View-ViewModel)模式提供了一系列实用的特性和工具,能帮助开发者更高效地构建 WPF、UWP、MAUI 等应用程序。 本文介绍如下: 一、使用(旧)的MvvmLight库 其特点如下,要继承的基类是ViewModelBase;且使用…...
Dbeaver 执行 SQL 语句和执行 SQL 脚本的区别
执行 SQL 语句 执行 SQL 语句对应图标: 适用于执行单个 SQL 的情形,默认是在光标处或选中的文本上执行 SQL 查询。 实际上同时选择多个 SQL 并通过该方式去执行也可能成功,只是有失败的风险。因此不建议使用它来同时执行多个 SQL 语句。 情况…...
《Python3网络爬虫开发实战(第二版)》配套案例 spa6
Scrape | Moviehttps://spa6.scrape.center/ 请求影片列表api时,不仅有分页参数,还多了一个token,通过重发请求发现token有时间限制,所以得逆向token的生成代码。 通过xhr断点定位到接口请求位置 刷新页面或者点翻页按钮&#x…...
AWS 中国区 CloudFront SSL 证书到期更换实战指南
适用场景: AWS 中国区(宁夏区域 cn-northwest-1 或北京区域 cn-north-1)CloudFront 分配的 SSL 证书到期后无缝替换,域名主体为 domain.cn。 背景与痛点 当 CloudFront 使用的 SSL 证书即将到期时,需手动替换新证书以避免服务中断。由于 AWS 中国区 不支持 ACM 证书,必须…...
Python基础语法:字面量,注释,关键字,标识符,变量和引用,程序执行的3大流程
目录 字面量(数据的类型) 字面量的含义 常见字面量类型(6种) 输出各类字面量(print语句) 注释(单行和多行注释) 注释的作用 单行注释和多行注释 单行注释(ctrl/&a…...
SPL 量化 获取数据
下载数据 我们将股票数据分享在百度网盘上供下载,每工作日更新。 目前可供下载的数据有 A 股的日 K 线数据、股票代码列表和上市公司的基本面数据 下载链接: 百度网盘 下载数据的文件格式为 btx,是 SPL 的特有二进制格式。 btx 称为集文…...
VMware与Docker:虚拟化技术的双轨演进与融合实践
一、虚拟化的本质与价值重构 虚拟化(Virtualization)是通过软件抽象层将物理资源转化为可动态分配的虚拟单元,其核心价值在于打破"一机一用"的刚性架构,实现三大突破性转变: 资源解耦:硬件资源…...
3. pandas笔记之:创建
以下是 Pandas 主要数据结构的创建方式整理,涵盖 Series 和 DataFrame 的常见创建方法: 一、Series 创建方式 从列表/数组创建 import pandas as pd import numpy as np# 基础列表 s1 pd.Series([1, 3, 5, np.nan, 6])# 指定索引 s2 pd.Series([10, …...
潞晨科技将暂停DeepSeek API服务,AI大模型技术红利普惠化与市场竞争白热化叠加,内卷恶果,开始显现!
潞晨科技宣布暂停DeepSeek API服务的事件,不仅暴露了AI大模型行业的技术与成本博弈,更折射出国内AI生态中中小企业的生存困境和行业内卷的深层矛盾。这一事件背后,既有企业个体商业模式的局限性,也揭示了整个行业在技术迭代、成本控制和市场策略上的系统性挑战。 一、潞晨科…...
某大型电解铝厂电解系统谐波治理装置改造沃伦森电气
电解铝行业谐波治理解决方案——无源滤波装置优化升级,保障稳定运行 在电解铝生产过程中,谐波污染问题严重影响电网电能质量,甚至可能导致滤波装置损坏,引发群爆事故。河南登封某大型电解铝厂通过无源滤波装置智能化改造ÿ…...
Rust 学习笔记:安装 Rust
Rust 学习笔记:安装 Rust Rust 学习笔记:安装 Rust在 Windows 上安装 Rust命令行创建 Rust 项目在 Mac/Linux 上安装 Rust一些命令升级卸载cargo -hrustc -h 安装 RustRoverrust-analyzer Rust 学习笔记:安装 Rust 在 Windows 上安装 Rust …...
精准落地设计,现代项目管理中的深度实践
在数字化转型浪潮席卷全球的当下,项目管理的复杂性呈指数级增长。无论是软件开发、大型工程建设,还是企业流程再造,都面临着设计理念与实际执行之间的鸿沟。《人月神话》第6章中关于确保体系结构师设计准确落地的论述,为破解这一难…...
编译 C++ 报错“找不到 g++ 编译器”的终极解决方案(含 Windows/Linux/macOS)
前言 在使用终端编译 C 程序时,报错: 或类似提示,意味着你的系统尚未正确安装或配置 g 编译器。本篇将从零手把手教你在 Windows / Linux / macOS 下安装并配置 g,适用于新手或 C 入门阶段的你。 什么是 g? g 是 GN…...
联易融出席深圳链主企业供应链金融座谈会,加速对接票交所系统
近日,深圳市委金融办组织召开全市链主企业供应链金融高质量发展座谈会。联易融作为供应链金融企业代表,与虾皮信息科技、电子元器件和集成电路国际交易中心等代表性机构以及行业协会、金融机构参加了会议。 发展供应链金融是破解中小微企业融资难、融资…...
html单页业务介绍源码
源码介绍 html单页业务介绍源码,源码由HTMLCSSJS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行 效果预览 源码免费获取 html单页业务介绍源码...
单体OJ项目
单体项目版本、微服务版还需我再钻研钻研。 项目介绍 在系统前台,管理员可以创建、管理题目;用户可以自由搜索题目、阅读题目、编写并提交代码。 在系统后端,能够根据管理员设定的题目测试用例在代码沙箱 中对代码进行编译、运行、判断输出是否正确。 其…...
豆包桌面版 1.47.4 可做浏览器,免安装绿色版
自己动手升级更新办法: 下载新版本后安装,把 C:\Users\用户名\AppData\Local\Doubao\Application 文件夹的文件,拷贝替换 DoubaoPortable\App\Doubao 文件夹的文件,就升级成功了。 再把安装的豆包彻底卸载就可以。 桌面版比网页版…...
