返回顶部
首页 > 资讯 > 后端开发 > Python >Python中send()和sendal
  • 913
分享到

Python中send()和sendal

Pythonsendsendal 2023-01-30 22:01:50 913人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

估计每个学习python网络编程的人,都会遇到过这样的问题: send()和sendall()到底有什么区别? send()和sendall()原理是怎么样的? send()和sendall()能做什么事情? 到底是使用sen

估计每个学习python网络编程的人,都会遇到过这样的问题:

  • send()sendall()到底有什么区别?
  • send()sendall()原理是怎么样的?
  • send()sendall()能做什么事情?
  • 到底是使用send()还是sendall()

看完下面的文章,应该就能明白了

知识补充

首先会对一些常见的网络编程知识进行补充下:

MTU

通信术语 最大传输单元(Maximum Transmission Unit,MTU)是指一种通信协议的某一层上面所能通过的最大数据包大小(以字节为单位)

以以太网传送IPv4报文为例。MTU表示的长度包含IP包头的长度,如果IP层以上的协议层发送的数据报文的长度超过了MTU,则在发送者的IP层将对数据报文进行分片,在接收者的IP层对接收到的分片进行重组。

tcp传输的可靠性

  • 应用数据被分割成TCP认为最适合发送的数据块(根据MTU设定)。这和UDP完全不同,应用程序产生的数据长度将保持不变。由TCP传递给IP的信息单位称为报文段或段(segment)。

  • TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。当TCP收到发自TCP连接另一端的数据,它将发送一个确认。TCP有延迟确认的功能,在此功能没有打开,则是立即确认。功能打开,则由定时器触发确认时间点。

  • TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段(希望发端超时并重发)。

  • 既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。如果必要,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。

  • 既然IP数据报会发生重复,TCP的接收端必须丢弃重复的数据。

  • TCP还能提供流量控制。TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。

send()

使用send()进行发送的时候,Python将内容传递给系统底层的send接口,也就是说,Python并不知道这次调用是否会全部发送完成,比如MTU是1500,但是此次发送的内容是2000,那么除了包头等等其他信息占用,发送的量可能在1000左右,还有1000未发送完毕

但是,send()不会继续发送剩下的包,因为它只会发送一次,发送成功之后会返回此次发送的字节数,如上例,会返回数字1000给用户,然后就结束了

如果需要将剩下的1000发送完毕,需要用户自行获取返回结果,然后将内容剩下的部分继续调用send()进行发送

sendall()

sendall()是对send()的包装,完成了用户需要手动完成的部分,它会自动判断每次发送的内容量,然后从总内容中删除已发送的部分,将剩下的继续传给send()进行发送;

源码

send()是直接调用的系统底层接口,所以Python源码没有,只有C的,由于不是很懂C,所以就没有去找C源码了

下面的源码是从pypy中复制出来的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
def send(self, data, flags=0):
"""Send a data string to the Socket. For the optional flags
argument, see the Unix manual. Return the number of bytes
sent; this may be less than len(data) if the network is busy."""
with rffi.scoped_nonmovingbuffer(data) as dataptr:
return self.send_raw(dataptr, len(data), flags)
 
 
def sendall(self, data, flags=0, signal_checker=None):
"""Send a data string to the socket. For the optional flags
argument, see the Unix manual. This calls send() repeatedly
until all data is sent. If an error occurs, it's impossible
to tell how much data has been sent."""
with rffi.scoped_nonmovingbuffer(data) as dataptr:
remaining = len(data)
p = dataptr
while remaining > 0:
try:
res = self.send_raw(p, remaining, flags)
p = rffi.ptradd(p, res)
remaining -= res
except CSocketError, e:
if e.errno != _c.EINTR:
raise
if signal_checker is not None:
signal_checker()

看完此段源码,心中应该对send()sendall()有一些认识了

什么时候使用send()什么时候使用sendall()

一般情况下,我们都应该使用sendall(),除非自己弄懂了他们的原理,并且有必要在每次包发送之后进行一些必要的处理,不然我们都不需要去使用send(),而应该使用已经包装好的sendall()

--结束END--

本文标题: Python中send()和sendal

本文链接: https://lsjlt.com/news/179249.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python中send()和sendal
    估计每个学习Python网络编程的人,都会遇到过这样的问题: send()和sendall()到底有什么区别? send()和sendall()原理是怎么样的? send()和sendall()能做什么事情? 到底是使用sen...
    99+
    2023-01-30
    Python send sendal
  • python rabbitmq send
    #!/usr/bin/env python#-*- coding: utf8 -*- import pikaimport tracebacktry:    connection = pika.BlockingConnection(pika....
    99+
    2023-01-31
    python rabbitmq send
  • python之next和send用法详解
    如果send不携带参数,那么send(None) 和next()的作用的相同的,如: def a(): print('aaa') p = yield '123'  #print(p) print('bbb') ...
    99+
    2023-01-30
    详解 python send
  • send和sendto的区别
    send()和sendto()函数都用于发送数据,但是它们有一些区别。send()函数是在一个已经建立的连接上发送数据。它需要一个套...
    99+
    2023-09-02
    send
  • Android中post和send的区别是什么
    在Android中,"post"和"send"都是用于发送消息的方法,但它们具有一些区别。1. post:post方法用于在主线程的...
    99+
    2023-09-27
    Android
  • python怎么使用send唤醒
    这篇文章给大家分享的是有关python怎么使用send唤醒的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。python可以做什么Python是一种编程语言,内置了许多有效的工具,Python几乎无所不能,该语言通俗...
    99+
    2023-06-14
  • python使用send唤醒的方法
    今天小编给大家分享一下python使用send唤醒的方法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。说明除了可以使用nex...
    99+
    2023-06-30
  • Fedora 中如何使用 Firefox Send?
    ffsend 是 Firefox Send 的命令行客户端。本文将展示 Firefox Send 和 ffsend 如何工作。还会详细介绍如何在 Fedora 中安装和使用它。什么是 Firefox Send 和 ffsend?...
    99+
    2023-06-05
  • Fedora中怎么使用Firefox Send
    小编给大家分享一下Fedora中怎么使用Firefox Send,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Send 是 Firefox 提供的文件加密共享工具...
    99+
    2023-06-27
  • python生成式的send()方法(详解)
    随便在网上找了找,感觉都是讲半天讲不清楚,这里写一下。 def generator(): while True: receive=yield 1 print('extra'+str(...
    99+
    2022-06-04
    详解 方法 python
  • XMLHttpRequest的open和send方法怎么用
    这篇文章主要介绍“XMLHttpRequest的open和send方法怎么用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“XMLHttpRequest的open和s...
    99+
    2024-04-02
  • python怎么使用send启动生成器
    小编给大家分享一下python怎么使用send启动生成器,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、说明send方法启动生成器的时候可以传参数。如果第一次启...
    99+
    2023-06-15
  • C#SynchronizationContext以及Send和Post使用解读
    目录C# SynchronizationContext及Send和Post使用C#同步上下文SynchronizationContext学习笔记同步上下文的基本操作使用同步上下文来更...
    99+
    2023-05-18
    C# SynchronizationContext C#使用Send C#使用Post
  • 浅谈Python生成器generator之next和send的运行流程(详解)
    对于普通的生成器,第一个next调用,相当于启动生成器,会从生成器函数的第一行代码开始执行,直到第一次执行完yield语句(第4行)后,跳出生成器函数。 然后第二个next调用,进入生成器函数后,从yiel...
    99+
    2022-06-04
    生成器 浅谈 详解
  • 浅谈python socket函数中,send与sendall的区别与使用方法
    在python socket编程中,有两个发送TCP的函数,send()与sendall(),区别如下: socket.send(string[, flags])  发送TCP数据,返回发送的字节大小。这个...
    99+
    2022-06-04
    浅谈 使用方法 函数
  • NodeJs中express框架的send()方法简介
    express框架的send方法 ①send方法用的还挺多的,因此需要明确其作用; ②原型是: res.send([body|status], [body]) 即既可以直接发送内容,也可以第一个...
    99+
    2022-06-04
    框架 简介 方法
  • 在Fedora中如何利用ffsend使用Firefox Send
    这篇文章将为大家详细讲解有关在Fedora中如何利用ffsend使用Firefox Send,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。什么是 Firefox Send 和 ffsend?Firefox...
    99+
    2023-06-16
  • expect中怎么在send语句上加变量
    这篇文章主要介绍“expect中怎么在send语句上加变量”,在日常操作中,相信很多人在expect中怎么在send语句上加变量问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”expect中怎么在send语句上...
    99+
    2023-06-09
  • expect中为send语句上加变量的代码
    #!/usr/bin/expectset ssh_user "fivetrees"set password "123456"spawn ssh -i /root/.ssh/$ssh_user root@x...
    99+
    2022-06-04
    变量 中为 语句
  • python中time.time()和
    python中time.time()和 time.strftime(): time.time()返回的是一个浮点数,以秒为单位,time.strftime后可以自定义格式,如time.strftime('%Y-%m-%d %H:%M:%S'...
    99+
    2023-01-31
    python time
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作