РЕШЕНО, используя следующее: Python Socket получает большой объем данных
У меня есть сервер и клиент.Я пытаюсь отправить байты через сокеты от клиента к серверу.Однако, когда он действительно пытается отправить байты, он завершился ошибкой: socket.error errno 90 message too long
.Есть ли способ обойти эту ошибку?
Клиент:
from socket import socket, AF_INET, SOCK_DGRAM
import pyscreenshot as ImageGrab
SERVER = 'xxxx.xxxx.xxxx.xxxx'
PORT = 5000
mySocket = socket(AF_INET, SOCK_DGRAM)
while True:
im = ImageGrab.grab(bbox=(0,27,320,266))
im.save('test.png')
myfile = open('test.png')
bytes = myfile.read()
mySocket.sendto(bytes, (SERVER, PORT))
myfile.close()
Сервер:
from socket import socket, gethostbyname, AF_INET, SOCK_DGRAM
import cv2
from PIL import Image
import io
PORT_NUMBER = 5000
SIZE = 150000
hostName = gethostbyname( '0.0.0.0' )
mySocket = socket(AF_INET, SOCK_DGRAM)
mySocket.bind((hostName, PORT_NUMBER))
while True:
(data, addr) = mySocket.recvfrom(SIZE)
image = Image.open(io.BytesIO(data))
image.save('test.png')
imga = cv2.imread('test.png', 0)
sys.exit()
Так что теперь я использую TCP-соединение.
Новый клиент:
from socket import socket, AF_INET, SOCK_STREAM
import pyscreenshot as ImageGrab
SERVER = 'xxxx.xxxx.xxxx.xxxx'
PORT = 5000
mySocket = socket(AF_INET, SOCK_STREAM)
mySocket.connect((SERVER, PORT))
while True:
im = ImageGrab.grab(bbox=(0,27,320,266))
im.save('test.png')
myfile = open('test.png')
bytes = myfile.read()
mySocket.sendall(bytes)
myfile.close()
Новый сервер:
from socket import socket, gethostbyname, AF_INET, SOCK_STREAM
import cv2
from PIL import Image
import io
import time
PORT_NUMBER = 5000
SIZE = 150000
hostName = gethostbyname( '0.0.0.0' )
mySocket = socket(AF_INET, SOCK_STREAM)
mySocket.bind((hostName, PORT_NUMBER))
mySocket.listen(1)
conn, addr = mySocket.accept()
print("Test server listening on port {0}\n".format(PORT_NUMBER))
while True:
data = conn.recv(SIZE)
last_time = time.time()
image = Image.open(io.BytesIO(data))
image.save('test.png')
imga = cv2.imread('test.png', 0)
print('loop took {} seconds'.format(time.time() - last_time))
sys.exit()
Поэтому, когда я пытаюсь запустить оба, я получаю следующую ошибку: ( важно: когда яотправьте через сокеты небольшое количество байтов, оно успешно отправлено, но при большом количестве байтов возникает следующая ошибка )
C:\Users\Tal\test\Scripts\python.exe
C:/Users/Tal/PycharmProjects/test/tester.py
Test server listening on port 5000
Traceback (most recent call last):
File "C:\Users\Tal\test\lib\site-packages\PIL\ImageFile.py", line 221, in load
s = read(self.decodermaxblock)
File "C:\Users\Tal\test\lib\site-packages\PIL\PngImagePlugin.py", line 621, in load_read
cid, pos, length = self.png.read()
File "C:\Users\Tal\test\lib\site-packages\PIL\PngImagePlugin.py", line 115, in read
length = i32(s)
File "C:\Users\Tal\test\lib\site-packages\PIL\_binary.py", line 77, in i32be
return unpack_from(">I", c, o)[0]
struct.error: unpack_from requires a buffer of at least 4 bytes
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:/Users/Tal/PycharmProjects/test/tester.py", line 23, in <module>
image.save('test.png')
File "C:\Users\Tal\test\lib\site-packages\PIL\Image.py", line 1935, in save
self.load()
File "C:\Users\Tal\test\lib\site-packages\PIL\ImageFile.py", line 227, in load
raise IOError("image file is truncated")
OSError: image file is truncated
Process finished with exit code 1