Skip to main content
 首页 » 编程设计

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

2025年05月04日13zdz8207

我正在尝试通过 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() 

请您参考如下方法:

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

如果您没有使用 UDP 的特殊原因,您也可以通过指定 socket.SOCK_STREAM 而不是 socket.SOCK_DGRAM 来使用 TCP。您不必担心数据包大小和顺序。