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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import socket

obj = socket.socket()
obj.connect(('127.0.0.1', 8089))

data = "This is the message to be sent."
block = 0
block_size = 5

# 方式一:sendall()
while True:
obj.sendall(data.encode())
break

# 方式二:send()
while True:
obj.send(data[block:block+block_size].encode())
if block > len(data):
break
else:
block += block_size

以上两种代码均用来实现发送一条完整的数据。

参考文章