当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《尝试在python中通过套接字传递(大)图像时出错》经验,为你挑选了1个好方法。

我试图通过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()

sth.. 5

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

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



1> sth..:

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

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

推荐阅读
家具销售_903
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有