Не удалось отправить байты через сокеты: сообщение слишком длинное - PullRequest
0 голосов
/ 29 ноября 2018

РЕШЕНО, используя следующее: 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
...