2024.6.18

news2024/10/6 8:22:41

Python的网络编程

网络四层
在开始前,我们需要先了解一下我们在网络通信过程中的四个层次
在这里插入图片描述
我们上网产生的数据都是经过协议栈一层一层的封装然后经网卡发送到网络,经网络发送到服务端,然后服务端又是一层一层的解封装拿到自己想要的数据。

我们学习的tcp和udp都是基于IP(网际互连协议)实现的

IP
计算机在互联网时必须要有一个唯一的标识,这样才能确定数据能够唯一发送
这个标识就是ip
目前有两种格式,一种是ipv4,一种是ipv6
127.0.0.1
回环地址,通俗的讲,就是我们在主机上发送给127开头的IP地址的数据包会被发送的主机自己接收,根本传不出去,外部设备也无法通过回环地址访问到本机。本机内联络时,我们一般就用它表示自己的ip地址

端口
是用来区分计算机应用程序的一个整数
范围是0到66535,我们使用时一般用大一些的端口号以免和别的程序冲突.像8080,9999等

两种通讯方式的不同
TCP

在链接时会进行"三次握手"来确保通信的安全
它负责将两台计算机建立可靠链接,能够保证将信息安全送达.
是一种可靠的,一对一的,面向链接的通信协议

UDP
它是无连接的,就像发短信一样,只要知道对方的IP地址和端口好就可以发送
但是因此它不保证信息的安全,也不一定能数据到达接收方

套接字socket

在我们编程时,我们关心的是我们的应用程序的数据能不能正常的发送出去和接收服务端发回来的数据。
这就需要一个桥梁,一端连接操作系统的协议栈,一端连接用户的应用数据。socket就是这个桥梁。

套接指的是套接管,就是将两根水管套接起来的管子,然后“字”是此连接的数据标识,即一个WORD,所以套接字就是一个标识连接的数据体。

这里它套接的又是什么东西呢?
它包含着通信的目的IP地址、使用的传输层协议(TCP或UDP)和使用的端口号。

Socket原意是“插座”。通过将这3个参数结合起来,与一个“插座”Socket绑定,应用层就可以和传输层通过套接字接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。

Python中的socket模块

常用的方法

bind((ip,port)) 绑定IP地址和端口
listen(N) 开始TCP监听,N表示操作系统挂起的最大连接数量,取值范围1-5之间,一般设置为5
accept() 被动接收TCP客户端连接,阻塞式
connect((ip,port)) 主动初始化TCP服务器连接
recv(size) 接收TCP数据,返回值为字符串类型,size表示要接收的最大数据量
send(str) 发送TCP数据,返回值是要发送的字节数量
recvfrom() 接收UDP数据,返回值为一个元组(data,address),data表示接收的数据,address表示发送数据的套接字地址
sendto(data,(ip,port)) 发送UDP数据,返回值是发送的字节数
close() 关闭套接字

我们发现,tcp和udp的使用方法不一样,所有要区分开使用

tcp版
我们先写服务器端

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('127.0.0.1', 8080))
s.listen(1)

while True:
    conn, addr = s.accept()
    print('Connected by', addr)
    data = conn.recv(1024)
    conn.sendall(b'Hello, world')
    conn.close()

我们注意到,服务器端要先绑定一个端口和ip地址,这个绑定的意义在于,告诉计算机去哪个IP地址找哪个应用端口来连接
之后就是监听,监听这个动作就是等待一个来连接的客户端
accept就是开始被动接受过来的链接,只有服务器这边通过了(accept)之后,客户端才能连接到服务器
recv就是接受传来的信息

然后我们再写客户端

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 8080))
s.sendall(b'Hello, world')
data = s.recv(1024)
s.close()
print('Received', repr(data))

这里和服务器很不一样,因为是客户端,毕竟客户是这样的,只需要负责connect到服务器就行了,服务器要做的就多了
然后连接好了我们就可以发送数据了,想接收数据也正常用recv就可以

udp版

import socket
server_address = ('192.168.31.54', 12345)
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
while True:
    message = "祖国必定统一!"
    client_socket.sendto(message.encode(), server_address)#发送数据
    data,server = client_socket.recvfrom(1024)#接收数据

很显然,udp这边不需要连接,只需要确定好ip和端口,然后朝着这个地址用sendto发送消息就好了
想接受也只需要用recvfrom,然后解包赋值获取data和地址就好

区别
主要就创捷套接字时
一个是socket.SOCK_STREAM流式的双向连接
一个是socket.SOCK_DGRAM这里的dgram就是数据报的意思,说明是无连接的电报式的发送

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

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

相关文章

【Linux】自定义shell(命令行解释器)

原理: shell是命令行解释器,当有命令需要执行时,shell创建子进程,让子进程执行命令,而shell只需等待子进程退出即可。 其中我们使用了下面这几个函数: 获取命令行(fgets函数)。解析…

MAX30102驱动

文章目录 一、引言二、MAX30102传感器概述2.1 模块原理血氧饱和度(SpO2)测量原理心率测量原理 2.2 模块工作流程 三、硬件连接四、驱动程序4.1 FIFO介绍4.2 max30102寄存器配置 五、数据采集与处理六、示例项目七、故障排除八、结论九、附录 一、引言 本…

虚拟货币投资指南|XEX交易所

什么是虚拟货币? 虚拟货币是一种基于区块链技术的数字资产,具有去中心化、透明性和安全性等特点。比特币(BTC)、以太坊(ETH)和莱特币(LTC)等是目前较为知名的虚拟货币。 虚拟货币投…

降压开关稳压器如何使用串联晶体管

降压开关稳压器是一种开关模式电源电路,旨在有效地将直流电压从较高电压降低到较低电压,即减去或“降压”电源电压,从而降低输出端可用的电压端子无需改变极性。换句话说,降压开关调节器是降压调节器电路,因此例如降压…

生成对抗网络——GAN深度卷积实现(代码+理解)

本篇博客为 上篇博客的 另一个实现版本,训练流程相同,所以只实现代码,感兴趣可以跳转看一下。 生成对抗网络—GAN(代码理解) http://t.csdnimg.cn/HDfLOhttp://t.csdnimg.cn/HDfLO 目录 一、GAN深度卷积实现 1. 模型…

苍穹外卖---导入接口文档

一、前后端分离开发流程 第一步:定义接口,确定接口的路径、请求方式、传入参数、返回参数。 第二步:前端开发人员和后端开发人员并行开发,同时,也可自测。 第三步:前后端人员进行连调测试。 第四步&…

搭建zookeeper、Kafka集群

搭建zookeeper、Kafka集群 1、绘制kafka的存储结构、副本机制2、搭建zookeeper集群3、搭建kafka集群4、使用kafka创建名为自己姓名汉语拼音的topic5、查看topic的分区和副本策略 1、绘制kafka的存储结构、副本机制 2、搭建zookeeper集群 实验环境准备: 3台服务器&…

界面追踪方法Level Set与VOF在气泡流动模拟的效果比较

对于两相流模拟,模型主要分为两大类:高相分数模型和界面捕捉类模型。当我们关注水中的含气量(气泡界面及气泡形状可忽略),则采用高相分数模型,此模型适用于气泡特别多的流动问题。对于有明确边界的流体&…

AI安全水深流急,黄铁军首谈AGI能力与风险分级,2024智源大会圆满落幕

2024年6月15日,为期 2 天的北京智源大会圆满落下帷幕。本次大会围绕大语言模型、多模态模型、Agent、具身智能、数据新基建、AI系统、AI开源、AI for Science、AI安全等人工智能热门技术方向和焦点议题,召开了20平行论坛,共计百场报告。 过去…

Linux top 命令使用教程

转载请标明出处:https://blog.csdn.net/donkor_/article/details/139775547 文章目录 一、top 是什么二、top的基础语法三、top输出信息解读 一、top 是什么 Linux top 是一个在Linux和其他类 Unix 系统上常用的实时系统监控工具。它提供了一个动态的、交互式的实时…

基于JSP的房屋租赁系统

开头语: 你好,我是专注于计算机科学与技术研究的学长。如果你对房屋租赁系统感兴趣或有相关开发需求,欢迎联系我。 开发语言:Java 数据库:MySQL 技术:JSPJavaBeansServlet 工具:MyEclipse、…

gRPC(Google Remote Procedure Call Protocol)谷歌远程过程调用协议

文章目录 1、gRPC简介2、gRPC核心的设计思路3、gPRC与protobuf关系 1、gRPC简介 gPRC是由google开源的一个高性能的RPC框架。Stubby Google内部的RPC,演化而来的,2015年正式开源。云原生时代是一个RPC标准。 2、gRPC核心的设计思路 网络通信 ---> gPR…

VM4.3 二次开发04 方案输出结果设置

方案输出结果设置,这个设置是为了在二次开发的上位机软件中显示我们想要的数据,和在二开中如何获取这些结果。 打开方案点下如中的图标。 打开如下图。 再点点红色圈出来的图标,打开参数设置界面。 输出设置可以要输出的数据和参数名称。点上…

【Linux】程序地址空间之动态库的加载

我们先进行一个整体轮廓的了解,随后在深入理解细节。 在动态库加载之前还要说一下程序的加载,因为理解了程序的加载对动态库会有更深的理解。 轮廓: 首先,不管是程序还是动态库刚开始都是在磁盘中的,想要执行对应的可…

隧道代理是什么?怎么运作的?

隧道代理作为网络代理的一种形式,已经在现代互联网世界中扮演着重要的角色。无论是保护隐私、访问受限网站还是实现网络流量的安全传输,隧道代理都发挥着重要作用。在本文中,我们将深入探讨隧道代理的概念、运作方式以及在不同场景中的应用。…

ClickHouse 高性能的列式数据库管理系统

ClickHouse是一个高性能的列式数据库管理系统(DBMS),主要用于在线分析处理查询(OLAP)。以下是对ClickHouse的详细介绍: 基本信息: 来源:由俄罗斯的Yandex公司于2016年开源。全称&…

在向量数据库中存储多模态数据,通过文字搜索图片

在向量数据中存储多模态数据,通过文字搜索图片,Chroma 支持文字和图片,通过 OpenClip 模型对文字以及图片做 Embedding。本文通过 Chroma 实现一个文字搜索图片的功能。 OpenClip CLIP(Contrastive Language-Image Pretraining&…

Eigen中 Row-Major 和 Column-Major 存储顺序的区别

Eigen中 Row-Major 和 Column-Major 存储顺序的区别 flyfish Eigen::RowMajor 是 Eigen 库中用于指定矩阵存储顺序的一种选项 理解 Row-Major 和 Column-Major 存储顺序的区别,绘制一个单一的图来显示内存中的元素访问顺序,在图中用箭头表示访问顺序. import nu…

【无重复字符的最长子串】

无重复字符的最长字串 一、题目二、解决方法1.暴力解法2.滑动窗口哈希 三、总结1.es6 new set()的用法添加元素add()删除元素delete()判断元素是否存在has 2.滑动窗口和双指针的联系和特点 一、题目 二、解决方法 1.暴力解法 解题思路:使用两层循环逐个生成子字符串…

Ardupilot开源代码之ExpressLRS性能实测方法

Ardupilot开源代码之ExpressLRS性能实测方法 1. 源由2. 测试效果3. 测试配置4. 总结5. 参考资料6. 补充 1. 源由 之前一直在讨论ExpressLRS性能的问题,有理论、模拟、实测。 始终缺乏完整的同一次测试的测试数据集,本章节将介绍如何在Ardupilot上进行获…