在 python 中,使用 while 循环的 Recvall 在两个设备之间不起作用

Recvall with while loop doesn't work between two devices in python

我有以下问题:我想要服务器发送文本文件的内容 当被要求这样做时。我已经编写了一个服务器脚本,它将内容发送到客户端,客户端脚本通过 revcall 循环接收所有内容。召回工作正常 我运行服务器端和客户端来自同一个设备进行测试。 但是当我 运行 来自同一 wifi 网络中不同设备的服务器从服务器设备接收文本文件内容时,recvall 不起作用,我只收到文本的前 1460 个字节。

服务器脚本

import socket

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(("", 5000))
server.listen(5)


def send_file(client):
    read_string = open("textfile", "rb").read()  #6 kilobyte large textfile
    client.send(read_string)


while True:
    client, data = server.accept()
    connect_data = client.recv(1024)
    if connect_data == b"send_string":
        send_file(client)
    else:
        pass

客户端脚本

import socket

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(("192.168.1.10", 5000))

connect_message = client.send(b"send_string")

receive_data = ""
while True:                                        # the recvall loop
    receive_data_part = client.recv(1024).decode()
    receive_data += receive_data_part
    if len(receive_data_part) < 1024:
        break

print(receive_data)

recv(1024)表示最少接收1个,最多1024个字节。如果连接已关闭,您将收到 0 个字节,如果出现问题,您将收到异常。

TCP 是一个字节流。对于 recv,它不会尝试将来自任何给定 send 的字节保持在一起。当您进行调用时,如果 TCP 端点有一些数据,您将获得该数据。

在客户端中,您假设小于 1024 字节的任何内容都必须是数据的最后一位。不是这样。您可以随时接收部分缓冲区。它在服务器端有点微妙,但是你犯了同样的错误,假设你将在一次调用中准确地收到命令 b"send_string"

您需要某种协议来告知接收者他们何时获得了适合某项操作的数据量。有很多方法可以做到这一点,所以我不能真正给你 答案。但这就是为什么存在像 zeromq、xmlrpc、http 等协议的原因...