Python套接字将多个发送的数据放入一个接收缓冲区

时间:2019-11-12 15:56:03

标签: python sockets networking tcp network-programming

我正在尝试使用Python创建一个简单的图像共享应用程序,以便可以将图像从客户端共享到服务器。我正在使用套接字并以numpy数组的形式发送图像。我的问题是,在加载应用程序时,我做出了这样的决定:将6张或更少的图像(如果少于6张)从服务器发送到客户端。每个图像都以唯一的名称存储在服务器中。此名称的长度可变,由用户决定,并在发送图像数组之前发送。同样,发送图像的形状以从客户端的字节中复制图像。但是由于名称长度不是固定的,因此我正在读取10个缓冲区大小。但是,如果名称较小,那么它也在读取我稍后发送的邮件的形状。我该如何解决?这是发送图像的代码:

def send_multiple_imgs(send_socket, imgs):
    num = len(imgs)
    send_socket.send(str(num).encode())
    for img in imgs:
        print(img)
        send_socket.send(img.encode())
        send_img(send_socket,imgs[img])

send_img函数的一部分:

def send_img(send_socket,img):
    send_socket.send(str(img.shape).encode())
    .....

我认为后面的部分并不重要。 这是接收部分:

def receive_multiple_img(recv_socket):
    num = int(recv_socket.recv(1).decode())
    imgs = {}
    for i in range(num):
        img_name = recv_socket.recv(10).decode()
        print(img_name)
        imgs[img_name] = recieve_image(recv_socket)

    return imgs

正在发生的事情是,我有一个名为“ ds”的图像,形状为(200,200,4),但是img_name读为: 'ds(200,20',然后也将进一步的发送和接收弄乱了。如何解决此问题?我正在使用TCP协议:

s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)

我是python网络新手。所以,请考虑这是否是一个愚蠢的问题

1 个答案:

答案 0 :(得分:2)

TCP与UDP不同,是流协议。这意味着单个send()与单个read()不对应。对send()的调用只是将要发送的数据放入TCP发送缓冲区,而对read()的调用只是从TCP接收缓冲区返回字节。缓冲区中的字节可能来自另一侧的单个send()或受到干扰。

这是一个常见的误会,导致许多错误。这里是我解释的againand againand againand again

如果您想send()分别发送几条消息或几条数据,则阅读者必须能够区分消息。有很多方法可以做到这一点,例如使用固定长度的消息,在每条消息之前为消息的长度加上前缀或使用定界符。