Python的Socket函数中send和sendall的区别如何使用
socket.send()
将数据发送到套接字。套接字必须连接到远程套接字。可选标志参数与recv()具有相同的含义。返回发送的字节数。并且需要应用程序(自己写的代码)自己负责检查所有数据是否已发送,如果只发送了一些数据,则应用程序(自己写的代码)自己需要尝试发送剩余数据。
(说白了就是发数据需要自己检查发送情况,如果没发完,需要自己写代码进行重发。通常适用于发送数据大小超过buf缓冲区的情况,小于buf的情况一般采用send和sendall效果相同)
socket.sendall()
将数据发送到套接字。套接字必须连接到远程套接字。可选标志参数与recv()具有相同的含义。与send()不同,此方法将继续从上次的发送位置继续发送数据,直到所有数据都已发送或出现错误为止。成功返回None。如果出现错误,将引发异常,因此他会导致无法确定成功发送了多少数据(如果有错误的话)。
(说白了就是,超出buf缓冲区的我会不断的给你发送,不需要手动控制续上次的末尾发新数据了,都自动接着上次发送的末尾发送超出buf的部分,直到完整数据发送完毕,但是如果中途发送数据出错,我没有办法确定哪些数据丢了也就没法确定成功发送了多少数据,发完了,发成功了我就给你返回个None,反之没成功给你个异常)
发送TCP数据
send()
的返回值是发送的字节数量,这个数量值可能小于要发送的string的字节数,也就是说可能无法发送string中所有的数据。如果有错误则会抛出异常。
发送TCP数据,
sendall()
尝试发送string的所有数据,成功则返回None,失败则抛出异常。
便于理解的简单例子参考:socket.send()
1 | import socket |
以上两种代码均用来实现发送一条完整的数据。
评论