【发布时间】:2020-03-30 11:45:16
【问题描述】:
我编写了两个程序来测试服务器端的 p23_server.py 和客户端的 p23_client.py :
p23_server.py
#p23_server.py
import socket
HOST = '10.0.2.15'
PORT = 12345
server = socket.socket()
server.bind((HOST,PORT))
server.listen(1)
(client,addr) = server.accept()
while True:
data = client.recv(32)
if not data:
break
print(data.decode('utf-8'))
server.close()
p23_client.py
#p23_client.py
import socket
import sys
HOST = '10.0.2.15'
PORT = 12345
string = sys.argv[1]
data_to_send = string.encode('utf-8')
s = socket.socket()
s.connect((HOST,PORT))
#s.sendall(data_to_send)
s.send(data_to_send)
s.close()
我运行 p23_server.py 然后执行命令:
wahalez@wahalez:~/dev/python$ python p23_client.py $(python -c 'for i in range(1024): print("a",end="")')
运行客户端并查看服务器输出的内容。
我使用 socket.send() 和 socket.sendall() 函数执行了一次。 结果是一样的。问题是为什么? 不应该只发送一次数据,然后服务器收到 32 个字节,就是这样?
与 send() 不同,此方法继续从字节发送数据,直到 要么所有数据都已发送,要么发生错误。没有返回 成功。出错时会引发异常,并且没有办法 确定成功发送了多少数据(如果有)。
为什么这两个函数产生相同的结果?
【问题讨论】:
-
虽然
send不保证发送所有数据,但它仍然可以在适当的情况下发送所有数据。拒绝发送所有数据即使有可能也是一种浪费。 -
你能澄清一下“不应该只发送一次数据然后服务器接收到 32 个字节就可以了”的意思吗?
send和recv的数据大小不是严格相关的,例如你可以一次send64 字节和两次recv32 字节。 -
这正是我的意思。那么有什么区别呢?我正在尝试发送各种长度,结果仍然相同......
-
那你发送什么“长度”?您示例中的消息是 1024 字节,可以轻松放入标准的 4096 缓冲区。请注意,消息大小可能取决于您的操作系统和硬件。
-
@Masklinn 我不想暗示它们不能更大(我知道它们经常如此)。由于它们的实际大小取决于系统,我只想提供一些(旧)默认值,它是 OP 可能使用的所有系统的下限。关键部分是 1024 太小了无法进行这样的测试。
标签: python sockets python-sockets