首页 > 解决方案 > 在 Socket Python 上发送图片

问题描述

我目前正在做一个项目,我需要通过 Python 将照片发送到另一台计算机。我正在使用模块 Socket,但是当我尝试发送照片时,我收到一条错误消息,提示“发送到数据报套接字的消息大于内部消息缓冲区或另一个网络边界,或者用于接收数据报的缓冲区是小于数据报本身”我该如何解决?谢谢

标签: pythonsocketsphotodatagram

解决方案


您的图像太大,无法在一个 UDP 数据包中发送。您需要将图像数据拆分为多个单独发送的数据包。socket.SOCK_STREAM 而不是 socket.SOCK_DGRAM。在那里,您不必担心数据包大小和排序。虽然你需要设置buffer_size。

import random
import socket, select
from time import gmtime, strftime
from random import randint

imgcounter = 1
basename = "image%s.png"

HOST = '127.0.0.1'
PORT = 6666

connected_clients_sockets = []

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind((HOST, PORT))
server_socket.listen(10)

connected_clients_sockets.append(server_socket)
buffer_size = 4096

while True:

    read_sockets, write_sockets, error_sockets = select.select(connected_clients_sockets, [], [])



    for sock in read_sockets:

        if sock == server_socket:

            sockfd, client_address = server_socket.accept()
            connected_clients_sockets.append(sockfd)

        else:
            try:
                print ' Buffer size is %s' % buffer_size
                data = sock.recv(buffer_size)
                txt = str(data)

                if txt.startswith('SIZE'):
                    tmp = txt.split()
                    size = int(tmp[1])

                    print 'got size'
                    print 'size is %s' % size

                    sock.send("GOT SIZE")
                    # Now set the buffer size for the image 
                    buffer_size = 40960000

                elif txt.startswith('BYE'):
                    sock.shutdown()

                elif data:

                    myfile = open(basename % imgcounter, 'wb')

                    # data = sock.recv(buffer_size)
                    if not data:
                        myfile.close()
                        break
                    myfile.write(data)
                    myfile.close()

                    sock.send("GOT IMAGE")
                    buffer_size = 4096
                    sock.shutdown()
            except:
                sock.close()
                connected_clients_sockets.remove(sock)
                continue
        imgcounter += 1
server_socket.close()

推荐阅读