Python-Fehlermeldung: “socket.error: [Errno 11] Resource temporarily unavailable" beim senden von Bild
Möchte ich ein Programm, das auf Bilder aus Dateien, verschlüsselt diese und sendet Sie an einen server.
Als der server soll zum decodieren des Bilds und speichern der Datei.
Getestet habe ich die Bild-Codierung selbst, und es funktioniert, also liegt das problem in der server-und client-Verbindung.
Hier ist der server:
import socket
import errno
import base64
from PIL import Image
import StringIO
def connect(c):
try:
image = c.recv(8192)
return image
except IOError as e:
if e.errno == errno.EWOULDBLOCK:
connect(c)
def Main():
host = '138.106.180.21'
port = 12345
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP)
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
s.bind((host, port))
s.listen(1)
while True:
c, addr = s.accept()
c.setblocking(0)
print "Connection from: " + str(addr)
image = c.recv(8192)#connect(c)
imgname = 'test.png'
fh = open(imgname, "wb")
if image == 'cusdom_image':
with open('images.png', "rb") as imageFile:
image = ''
image = base64.b64encode(imageFile.read())
print image
fh.write(image.decode('base64'))
fh.close()
if __name__ == '__main__':
Main()
Ist und hier der client:
import socket
import base64
from PIL import Image
import StringIO
import os, sys
ip = '138.106.180.21'
port = 12345
print 'Add event executed'
s = socket.socket()
s.connect((ip, port))
image_path = '/home/gilgamesch/Bilder/Bildschirmfoto.png'
print os.getcwd()
olddir = os.getcwd()
os.chdir('/')
print os.getcwd()
if image_path != '':
with open(image_path, "rb") as imageFile:
image_data = base64.b64encode(imageFile.read())
print 'open worked'
else:
image_data = 'cusdom_image'
os.chdir(olddir)
s.send(image_data)
s.close()
Und die Fehlermeldung ist:
Traceback (most recent call last):
File "imgserv.py", line 49, in <module>
Main()
File "imgserv.py", line 34, in Main
image = c.recv(8192)#connect(c)
socket.error: [Errno 11] Resource temporarily unavailable
InformationsquelleAutor Gilgamesch von Uruk | 2016-08-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der server-Einstellung der remote-Buchse (zurückgegeben von
accept()
) non-blocking-Modus, was bedeutet, dass I/O in das socket wird sofort beenden, indem Sie eine Ausnahme, wenn es keine Daten zu Lesen.Wird es in der Regel einen Zeitraum von Zeit, die zwischen herstellen der Verbindung mit dem server und die Bild Daten, die vom client gesendet. Der server versucht, sofort Auslesen von Daten aus dem client, wenn die Verbindung akzeptiert wird, aber könnte es nicht sein, alle Daten zu Lesen, noch, so
c.recv()
wirft einesocket.error: [Errno 11] Resource temporarily unavailable
Ausnahme. Errno 11 entsprichtEWOULDBLOCK
, sorecv()
abgebrochen, weil es keine Daten bereit zu Lesen.Ihren code nicht zu erfordern scheinen, dass nicht-blockierende sockets, da gibt es eine
accept()
an der Spitze der while-Schleife, und damit nur eine einzige Verbindung behandelt werden können, zu einer Zeit. Sie können entfernen Sie einfach den Anruf, umc.setblocking(0)
und das problem sollte Weg gehen.Das ist ein weiteres problem. Sie können
select()
um zu bestimmen, welche von mehreren sockets bereit sind zu Lesen, und rufen Sie dannrecv()
auf diejenigen, die es sind. Ergänzen Sie außerdem die wichtigsten server-socket auf der Liste von sockets übergebenselect()
und Anruf annehmen, der auf das socket, wennselect()
zeigt an, dass es lesbar ist. Es gibt alternativen in derselect
Modul wiepoll()
et. al.Sie sollten auch mit der
selectors
- Modul oderasyncio
, wenn Sie mit Python 3.4 oder höher.asyncore
ist eine option, auf Python 2.InformationsquelleAutor mhawke