尝试通过Python中的套接字传递(大)图像时出错

问题描述 投票:0回答:3

我正在尝试通过 python 套接字传递图像,对于较小的图像,它工作正常,但对于较大的图像,它会给出错误

socket.error: [Errno 10040] 在数据报套接字上发送的消息大于 内部消息缓冲区或其他一些网络限制,或者用于接收数据报的缓冲区小于数据报本身

我正在使用

socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

感谢您提供任何线索。

我尝试使用 SOCK_STREAM,它不起作用..它只是说我开始......然后挂出。没有输出..它不是来自发送功能

import thread
import socket
import ImageGrab

class p2p:
    def __init__(self):
        socket.setdefaulttimeout(50)
        #send port
        self.send_port = 3000
        #receive port
        self.recv_port=2000

        #OUR IP HERE
        self.peerid = '127.0.0.1:'
        #DESTINATION 
        self.recv_peers = '127.0.0.1'

        #declaring sender socket
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM )
        self.socket.bind(('127.0.0.1', self.send_port))
        self.socket.settimeout(50)

        #receiver socket
        self.serverSocket=socket.socket(socket.AF_INET, socket.SOCK_STREAM )
        self.serverSocket.bind(('127.0.0.1', self.recv_port))
        self.serverSocket.settimeout(50)

        #starting thread for reception
        thread.start_new_thread(self.receiveData, ())

        #grabbing screenshot
        image = ImageGrab.grab()
        image.save("c:\\test.jpg")
        f = open("c:\\ test.jpg", "rb")
        data = f.read()
        #sending
        self.sendData(data)
        print 'sent...'
        f.close()

        while 1: pass

    def receiveData(self):
        f = open("c:\\received.png","wb")
        while 1:
            data,address = self.serverSocket.recvfrom(1024)
            if not data: break
            f.write(data)
        try:
            f.close()
        except:
            print 'could not save'
        print "received"
    def sendData(self,data):
        self.socket.sendto(data, (self.recv_peers,self.recv_port))
if __name__=='__main__':
    print 'Started......'    
    p2p()
python sockets
3个回答
5
投票

您的图像太大,无法在一个 UDP 数据包中发送。您需要将图像数据拆分为多个数据包,然后单独发送。

如果您没有特殊原因使用 UDP,您也可以通过指定

socket.SOCK_STREAM
而不是
socket.SOCK_DGRAM
来使用 TCP。在那里您不必担心数据包大小和订购。


2
投票

您发送的消息正在被截断

由于您没有显示

send
的实际代码,我猜您正在尝试将整个图像写入套接字。 您必须将图像分成几个更小的块。


0
投票

数据,地址 = self.serverSocket.recvfrom(1024) <<< increase this

© www.soinside.com 2019 - 2024. All rights reserved.