全网最详细python中socket套接字send与sendall的区别
将数据发送到套接字。 套接字必须连接到远程套接字。 返回发送的字节数。 应用程序负责检查是否已发送所有数据; 如果仅传输了一些数据,
则应用程序需要尝试传递剩余数据。(需要用户自己完成)
将数据发送到套接字。 套接字必须连接到远程套接字。 与send()不同,此方法继续从字符串发送数据,直到所有数据都已发送或发生错误。
成功后不返回任何内容。 出错时,会引发异常,并且无法确定成功发送了多少数据(如果有)。
# 发送TCP数据 send()的返回值是发送的字节数量,
#这个数量值可能小于要发送的string的字节数,
# 也就是说可能无法发送string中所有的数据。如果有错误则会抛出异常。
s.send()
不是socket自己会运行这个机制,需要用户自己写
def mysend(msg):
totalsent = 0
while totalsent < MSGLEN:
sent =sock.send(msg[totalsent:])
if sent == 0:
raise RuntimeError("socket connection broken")
totalsent = totalsent + sent
# 发送TCP数据,sendall()尝试发送string的所有数据,成功则返回None,失败则抛出异常。
知识补充
首先会对一些常见的网络编程知识进行补充下:
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()
进行发送;
最新文章
- ZOJ Problem Set - 1392 The Hardest Problem Ever
- 获取本机IP地址
- jxl写入excel实现数据导出功能
- zookeeper系列之通信模型(转)
- nullptr和NULL
- oracle rac常用的命令
- 【转载】 Java:按值传递还是按引用传递详细解说
- Python基础学习篇章三
- [C#网络应用编程]1、对进程的操作
- Java开发学习心得(二):Mybatis和Url路由
- p3966单词
- eclipse使用CXF3.1.*创建webservice服务端客户端以及客户端手机APP(一)
- 异常java.lang.IllegalArgumentException:attempt to create delete event with null entity
- java.lang.RuntimeException: Canvas: trying to draw too large(203212800bytes) bitmap.
- Zigbee 的 mesh功能设置
- 201621123008 《Java程序设计》第二周学习总结
- Apache安装完后加入系统服务的相关操作详解
- scriptlet
- (4)剑指Offer之链表相关编程题
- 软件项目技术点(1)——Tween算法及缓动效果