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

[Python学习日记-76] 网络编程中的 socket 开发 —— 介绍、工作流程、socket 模块用法和函数介绍

[Python学习日记-76] 网络编程中的 socket 开发 —— 介绍、工作流程、socket 模块用法和函数介绍

简介

socket 介绍

socket 的工作流程及用法

简介

        前面在[Python学习日记-75] 计算机基础与网络当中介绍了一大堆基础知识之后我们终于开始进入到网络编程的开发阶段了,那到底什么是网络编程呢?从编程开发的角度来看其实就是进行 socket 开发,而我们前面提到学习网络编程就是想要写出一个 C/S 架构的软件,而学习 socket 就是为了完成 C/S 架构的开发。

        为什么学习 socket 一定要先学习网络协议呢?首先,我们学习网络编程的目标是为了写出一个基于 socket 编程开发一款自己的 C/S 架构的软件;其次,C/S架构的软件(软件属于应用层)是基于网络进行通信的;然后,网络的核心即一堆协议,而协议即是标准,你想开发一款基于网络通信的软件,就必须遵循这些标准;最后,就让我们从这些标准开始研究,开启我们的 socket 编程之旅。下图为基于 TCP/IP 协议集的网络应用传输流程图

        如果对网络还不了解的同学,建议先看看前面[Python学习日记-75] 计算机基础与网络这篇博客。

socket 介绍

一、socket 概念

        套接字(socket)是网络编程中用于实现网络通信的一种机制。它是一种特殊的文件描述符,可以通过它进行网络连接、数据传输和接收等操作。socket 是应用层与 TCP/IP 协议集通信的中间软件抽象层,即它是一组接口。在设计模式中,socket 其实就是一个门面模式,它把复杂的 TCP/IP 协议集隐藏在 socket 接口后面,这就相当于在应用层和传输层之间插入了一层东西,被称之为 socket 抽象层。对用户来说,一组简单的接口就是全部,在使用时只需调用 socket 接口让其去组织数据,就可以符合指定的协议即可传输数据。

        所以,我们无需深入理解 TCP/UDP 协议,因为 socket 已经为我们封装好一个个接口了,我们只需要遵循 socket 的规则去编程调用接口,这样写出的程序自然就是遵循 TCP/UDP 的标准了。 

二、套接字发展史及分类

        套接字起源于20世纪70年代加利福尼亚大学伯克利分校版本的 Unix,即人们所说的 BSD Unix。因此,有时人们也把套接字称为“伯克利套接字”或“BSD 套接字”。一开始,套接字被设计用在同一台主机上多个应用程序之间的通讯。这也被称进程间通讯(IPC)。套接字有两种(或者称为有两个种族),分别是基于文件型的和基于网络型的。

1、基于文件型的套接字家族

        这类套接字被称为:AF_UNIX,在 Unix 中一切皆文件,基于文件的套接字调用的就是底层的文件系统来取数据,两个套接字进程运行在同一机器,可以通过访问同一个文件系统间接完成通信。

2、基于网络型的套接字家族

        这类套接字被称为:AF_INET/AF_INET6,AF_INET 被用于 IPv4,而 AF_INET6 被用于 IPv6。当然还有很多其他的地址家族,不过它们要么是只用于某个平台,要么就是已经被废弃,要么是很少被使用,或者是根本没有实现,在所有地址家族中,AF_INET 是使用最广泛的一个,在 Python 中支持很多种地址家族,但是在网络编程中大部分时间我们只使用 AF_INET。

socket 的工作流程及用法

一、socket 的工作流程

        socket 的工作模式与生活中的打电话非常类似,假设你要打电话给你一个朋友,你们之间要建立起连接来通话需要几步呢?看看是不是需要以下步骤:

  1. 买手机,绑定手机卡(插卡)
  2. 拨打你朋友的手机号码
  3. 朋友听到铃声后接起电话
  4. 通话连接建立起来了

        这些步骤按顺序分别对应了 socket 连接过程的 socket()、connect()、listen()/accept();具体的 socket 建立过程如下图所示

        如上图所示,服务器端先初始化 socket ——> 使用 bind() 绑定 IP 和 端口 ——> 使用 listen() 对端口进行监听 ——> 调用 accpet() 进行阻塞,等待客户端进行连接;这个时候有一个客户端进行初始化 socket ——> 使用 connect() 连接服务器,这个时候如果连接成功了客户端和服务器端的连接就建立了;客户端和服务器端分别使用 write() 和 read() 来发送数据和处理数据;当数据传输处理完毕后需要断开连接时会由客户端使用 close() 来发起结束请求,并关闭客户端的 socket,服务器端收到结束请求后将会在数据处理完毕后使用 close() 来关闭 socket,这样本次交互就结束了。

二、socket() 模块函数的用法

1、实例化 socket

import socket# 实例化套接字
socket.socket(socket_family, socket_type, protocal=0)
# socket_family:可以是 AF_UNIX 或 AF_INET
# socket_type:可以是 SOCK_STREAM 或 SOCK_DGRAM
# protocol 一般不填,默认值为0# 获取 TCP/IP 套接字
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 获取 UDP/IP 套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 由于 socket 模块当中属性太多了,如果每个属性前面都需要打 socket. 实在是太费事了,所以这里就破例使用了 "from socket import *" 把 socket 模块里的所有属性都带到我们的命名空间里了,这样能大幅减短我们的代码。
# 例如
tcp_socket = socket(AF_INET, SOCK_STREAM)

2、socket 中的函数

服务器端的套接字函数:

# 绑定(IP地址,端口号)到套接字
s.bind(ip, port)# 开始监听 TCP 端口
s.listen(backlog)    # backlog 是最大挂起连接数# 被动接受 TCP 客户端的连接,等待连接的到来,即当前服务器端是阻塞式的进行等待
s.accept()

客户端的套接字函数:

s.connect(ip, port)    # 主动初始化 TCP 服务器连接
s.connect_ex(ip, port)    # connect() 函数的扩展版本,出错时返回出错码,而不是抛出异常

公共用途的套接字函数:

# 接收 TCP 数据
s.recv(buffer_size)    # buffer_size 是一次接收的最大数据量,会将接收到的数据作为 string 返回# 发送 TCP 数据
s.send(data)    # send 在待发送数据量大于己端缓存区剩余空间时,数据丢失,不会发完# 发送完整的 TCP 数据
s.sendall(data)    # 本质就是循环调用 send,sendall 在待发送数据量大于己端缓存区剩余空间时,数据不丢失,循环调用 send 直到发完# 接收 UDP 数据
s.recvfrom(buffer_size)# 发送 UDP 数据
s.sendto(data)# 连接到当前套接字的远端的地址
s.getpeername()# 当前套接字的地址
s.getsockname()# 返回指定套接字的参数
s.getsockopt()# 设置指定套接字的参数
s.setsockopt(level, option, value)
# level:选项的级别,可以是 SOL_SOCKET 或 IPPROTO_TCP 等
# option:需要设置的选项,可以是 SO_REUSEADDR、SO_KEEPALIVE、TCP_NODELAY 等
# value:给选项设定的值# 关闭套接字
s.close()

面向锁的套接字函数:

# 设置套接字的阻塞与非阻塞模式
s.setblocking(bool)    # True 或 False# 设置阻塞套接字操作的超时时间
s.settimeout(timeout)    # 以秒为单位,当值为 None 或 0 时表示无超时,即阻塞式# 得到阻塞套接字操作的超时时间
s.gettimeout()

面向文件的套接字函数:

# 套接字的文件描述符
s.fileno()# 创建一个与该套接字相关的文件
s.makefile(mode)    # mode 是创建文件的 I/O 模式,支持 r(默认)、w、b

相关文章:

[Python学习日记-76] 网络编程中的 socket 开发 —— 介绍、工作流程、socket 模块用法和函数介绍

[Python学习日记-76] 网络编程中的 socket 开发 —— 介绍、工作流程、socket 模块用法和函数介绍 简介 socket 介绍 socket 的工作流程及用法 简介 前面在[Python学习日记-75] 计算机基础与网络当中介绍了一大堆基础知识之后我们终于开始进入到网络编程的开发阶段了&#x…...

vue(七) vue进阶

目录 第一课:Vue方法、计算机属性及侦听器 一、数组变化侦测 方法1:变更方法 方法2:替换一个数组 例子:小Demo:合并两个数组 二、计算属性 1.基础(不推荐) 2.使用计算属性来完成案例 3.使用函数的方…...

[Transformer] The Structure of GPT, Generative Pretrained Transformer

The Structure of Generative Pretrained Transformer Reference: The Transformer architecture of GPT models How GPT Models Work...

Django Admin 自定义操作封装

1. 为什么需要封装? 在Django开发中,我们经常需要在Admin界面添加自定义操作按钮,以便管理员执行特定的任务。通过封装,我们可以: 减少重复代码统一管理自定义操作的逻辑提高代码的可维护性和可扩展性 © ivwdcwso (ID: u012172506)2. CustomActionMixin 的实现 让我…...

http和https有哪些不同

http和https有哪些不同 1.数据传输的安全性:http非加密,https加密 2.端口号:http默认80端口,https默认443端口 3.性能:http基于tcp三次握手建立连接,https在tcp三次握手后还有TLS协议的四次握手确认加密…...

PL/SQL语言的数据库交互

PL/SQL语言的数据库交互 引言 在当今的信息化时代,数据库管理系统(DBMS)在各行各业中扮演着至关重要的角色。为了高效地与数据库进行交互,许多程序员、数据库管理员和系统分析师选择使用PL/SQL(Procedural Language/…...

亿道三防丨三防笔记本是什么意思?和普通笔记本的优势在哪里?

三防笔记本是什么意思?和普通笔记本的优势在哪里? 在现代社会中,笔记本电脑已经成为人们工作和生活中不可或缺的一部分。然而,在一些特殊行业或环境中,普通笔记本电脑由于其脆弱性和对环境条件的敏感性,往…...

从项目代码看 React:State 和 Props 的区别及应用场景实例讲解

在 React 中,state 和 props 是组件的两个重要概念,它们有不同的作用和应用场景。理解它们之间的区别对于开发 React 应用至关重要。 1. state 和 props 的区别 props (属性): props 是由父组件传递给子组件的数据或函数。props 是只读的&am…...

Vue 学习之旅:核心技术学习总结与实战案例分享(vue指令下+计算属性+侦听器)

Vue 学习之旅:核心技术学习总结与实战案例分享 文章目录 Vue 学习之旅:核心技术学习总结与实战案例分享一、指令补充(一)指令修饰符(二)v-bind 对样式操作的增强(三)v-model 应用于其…...

freertos的基础(二)内存管理:堆和栈

1. 堆(Heap) 定义 堆是 FreeRTOS 中用于动态内存分配的内存区域。FreeRTOS 提供了多种堆管理方案(如 heap_1、heap_2、heap_4 等),开发者可以根据需求选择合适的内存管理策略。 作用 用于动态分配内存,例…...

vue \n 换行不不显示

Vue 中&#xff0c;直接使用包含 \n 的字符串进行渲染时&#xff0c;换行符不会被识别为 HTML 的换行&#xff0c;因为 Vue 默认会将其视为普通文本。 对此提供两种解决办法 方法一&#xff1a;使用 v-html 指令替换 \n 为 <br> <template><div v-html"…...

GPT 系列论文精读:从 GPT-1 到 GPT-4

学习 & 参考资料 前置文章 Transformer 论文精读 机器学习 —— 李宏毅老师的 B 站搬运视频 自监督式学习(四) - GPT的野望[DLHLP 2020] 來自猎人暗黑大陆的模型 GPT-3 论文逐段精读 —— 沐神的论文精读合集 GPT&#xff0c;GPT-2&#xff0c;GPT-3 论文精读【论文精读】…...

在 Ubuntu 上安装和配置 Redis

在 Ubuntu 上安装和配置 Redis&#xff0c;并使用发布-订阅&#xff08;Pub/Sub&#xff09;功能&#xff0c;可以按照以下步骤进行&#xff1a; 一、安装 Redis 1. 更新包列表 首先&#xff0c;更新本地的包列表以确保获取到最新的软件包信息&#xff1a; sudo apt update…...

Excel中双引号问题

背景&#xff1a; 从Excel中读取数据时&#xff0c;发现有的单元格读出来是一个双引号&#xff0c;有的是一个双引号 "{""accountName"": ""全字段"",""accountState"": ""NORMAL"",&q…...

【机器学习】主动学习-增加标签的操作方法-流式选择性采样(Stream-based selective sampling)

Stream-Based Selective Sampling Stream-based selective sampling 是一种主动学习方法&#xff0c;在处理大量数据流时特别有用。它允许学习算法动态选择是否对当前数据实例进行标注&#xff08;通过与 Oracle 交互&#xff09;。此方法主要应用于流数据场景中&#xff0c;目…...

elementUI项目中,只弹一个【token过期提示】信息框的处理

关键代码 let msgArr document.querySelectorAll(.token401Message)if (!msgArr.length) {Message({customClass: token401Message,message: response.data.msg,type: error,onClose: () > {msgArr []}})} 完整代码 import axios from axios import { getToken } from…...

SpringBoot开发—— SpringBoot中如何实现 HTTP 请求的线程隔离

文章目录 1、Servlet 容器与线程池管理1.1 线程池的作用1.2 线程池的配置 2、HTTP 请求的线程隔离2.1 请求上下文和会话信息2.2 多线程处理的隔离性 3、 ThreadLocal 和线程上下文隔离3.1ThreadLocal的使用3.2 保证线程隔离性 4、Async异步任务的线程隔离4.1 异步任务的线程池4…...

【LLM】25.1.11 Arxiv LLM论文速递

25.1.10 12:00 - 25.1.11 12:00 共更新36 篇 —第1篇---- Supervision policies can shape long-term risk management in general-purpose AI models &#x1f50d; 关键词: 通用型人工智能&#xff0c;风险管理&#xff0c;监督政策&#xff0c;模拟框架 PDF链接 摘要: 通…...

单片机实物成品-012 酒精监测

项目介绍 本项目以软硬件结合的方式&#xff0c;选择 C 语言作为程序硬件编码语言&#xff0c; 以 STM32 单片机作为核心控制板&#xff0c;在数据传输节点上连接酒精传感器对酒精浓度进行 实时检测&#xff0c;且对高浓度酒精采取强制干预和紧急预警&#xff0c;并将数据通过…...

使用葡萄城+vue实现Excel

最终实现效果如下 包含增加复选框 设置公式 设置背景颜色等&#xff0c;代码实在太多 有需要可留言 第一步&#xff1a;创建表头 请使用官网提供的网址&#xff1a;在线 Excel 编辑器 | SpreadJS 在线表格编辑器 1.点击下方号&#xff0c;创建一个新的sheet页 默认新创建的she…...

Android 11开发避坑:为什么你的App获取的Wifi MAC地址总是变?手把手教你配置固定MAC

Android 11开发实战&#xff1a;彻底解决Wifi MAC地址随机化问题最近在开发一个设备管理系统时&#xff0c;遇到了一个棘手的问题&#xff1a;我们的App在Android 11设备上获取的Wifi MAC地址每次都不一样&#xff0c;导致基于MAC地址的设备识别功能完全失效。经过一周的深入研…...

从‘文件夹’到对象列表:手把手教你用MinIO Java Client实现灵活的文件查询与过滤

从‘文件夹’到对象列表&#xff1a;手把手教你用MinIO Java Client实现灵活的文件查询与过滤在当今数据驱动的时代&#xff0c;对象存储已成为现代应用架构中不可或缺的一部分。MinIO作为高性能、兼容S3协议的开源对象存储解决方案&#xff0c;凭借其轻量级和易用性赢得了众多…...

告别网盘客户端!用Alist+RaiDrive把百度云盘变成电脑本地文件夹(保姆级图文教程)

用AlistRaiDrive实现网盘本地化管理的终极方案 你是否厌倦了电脑上安装多个网盘客户端&#xff0c;不仅占用系统资源&#xff0c;操作还繁琐割裂&#xff1f;每次上传下载文件都要在不同客户端间切换&#xff0c;效率低下。现在&#xff0c;通过Alist和RaiDrive的组合&#xf…...

用STM32CubeMX和HAL库快速上手WS2812B:告别手动计算延时,一键生成驱动框架

基于STM32CubeMX的WS2812B智能灯光控制&#xff1a;从零构建现代化驱动方案在智能硬件和物联网设备快速发展的今天&#xff0c;WS2812B可编程LED灯带因其丰富的色彩表现和简单的单线控制方式&#xff0c;成为创客和工程师们最喜爱的显示组件之一。然而&#xff0c;传统的寄存器…...

从电磁炉到户外电源:拆解单相SVPWM如何让你的逆变器更安静、更高效

从电磁炉到户外电源&#xff1a;单相SVPWM如何实现静音与高效的双重突破当你深夜用电磁炉煮面时&#xff0c;是否曾被突然的蜂鸣声吓一跳&#xff1f;或是发现户外电源给设备充电时&#xff0c;散热风扇的噪音盖过了山林鸟鸣&#xff1f;这些常见问题背后&#xff0c;隐藏着一个…...

组态王通用扫码枪配置

使用组态王扫码枪驱动&#xff0c;是绑定变量&#xff0c;扫码后直接就可以显示扫码内容。解决每次扫码输入数据时必须先用鼠标点进输入框内的问题。驱动安装先添加驱动&#xff0c;亚控网站的文件为 barcodescanner&#xff0c;这个文件是组态王通用扫码枪的驱动&#xff0c;但…...

如何高效批量下载音乐歌词:智能歌词管理完整指南

如何高效批量下载音乐歌词&#xff1a;智能歌词管理完整指南 【免费下载链接】ZonyLrcToolsX ZonyLrcToolsX 是一个能够方便地下载歌词的小软件。 项目地址: https://gitcode.com/gh_mirrors/zo/ZonyLrcToolsX ZonyLrcToolsX 是一款专业的跨平台歌词下载工具&#xff0c…...

ROS Noetic实战:从bag包里‘抠’出雷达点云和IMU数据的保姆级教程(Ubuntu 20.04)

ROS Noetic实战&#xff1a;从bag包里提取雷达点云和IMU数据的完整指南&#xff08;Ubuntu 20.04&#xff09;在机器人开发中&#xff0c;ROS bag文件就像是一个装满珍贵数据的宝箱&#xff0c;而雷达点云和IMU数据则是其中最闪亮的宝石。作为一名长期与ROS打交道的开发者&…...

电子商务设计师软考备战:特别篇 - 综合模拟与备考策略

1. 考试形式与内容结构1.1 考试基本信息考试科目与时间基础知识考试&#xff1a;上午9:00-11:30&#xff08;150分钟&#xff09;应用技术考试&#xff1a;下午2:00-4:30&#xff08;150分钟&#xff09;题型与分值分布上午考试&#xff08;基础知识&#xff09;&#xff1a; -…...

打不开JupyterLab

因为安装某些依赖导致JupyterLab的依赖被动升级或降级&#xff0c;从而影响了JupyterLab的运行&#xff0c;此时可以SSH登录到实例&#xff0c;然后输入jupyter-lab命令进行确认&#xff0c;如果执行命令报错则说明是此问题&#xff0c;那么可以通过pip install jupyterlab再次…...