Отображение полученного изображения в pyqt - PullRequest
0 голосов
/ 27 февраля 2019

Я пытаюсь отобразить изображение, полученное с тестового локального сервера, в окне pyqt.Я попробовал эту ссылку, но не смог заставить ее работать.Не могли бы вы помочь с этим?Заранее спасибо.

Отображение изображения (в байтах) в PyQt

Код клиента

import socket
from PIL import Image
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel
from PyQt5.QtGui import QIcon, QPixmap

app = QApplication(sys.argv)
widget = QWidget()
label = QLabel(widget)

HOST = socket.gethostbyname(socket.gethostname())
PORT = 5000

s = socket.socket()
s.connect((HOST, PORT))

while True:
    image_binaries = s.recv(100000000)
    if not image_binaries:
        break
    #img = Image.open(BytesIO(image_binaries))


pixmap = QPixmap()
pixmap.loadFromData(image_binaries)
label.setPixmap(pixmap)
widget.resize(pixmap.width(), pixmap.height())

widget.show()
sys.exit(app.exec_())

Код сервера

import socket

HOST = "0.0.0.0"
PORT = 5000

s = socket.socket()
s.bind((HOST, PORT))

data = open(r'Screenshot_1.jpg', 'rb').read()
print("Waiting  for connection...")

s.listen(5)
while True:
    client, client_address = s.accept()
    print(client_address, "is connected")
    client.send(data)

1 Ответ

0 голосов
/ 27 февраля 2019

В этом коде есть разные проблемы.

Во-первых, неправильный цикл чтения.TCP - это потоковый протокол.Это означает, что данные могут входить в переменное количество пакетов, которые необходимо объединить.Так должно быть:

image_binaries = b""
while True:
    chunk = s.recv(100000000)
    if not chunk:
        break
    image_binaries += chunk
s.close()

Тогда у вас есть возможное состояние гонки со стороны сервера.client.send(data) вернется, как только все данные будут поставлены в очередь для передачи.Если немедленно произойдет другое соединение, client будет использовано повторно, что может привести к закрытию предыдущего соединения до того, как все будет отправлено.Вы должны использовать изящное отключение здесь:

while True:
    client, client_address = s.accept()
    print(client_address, "is connected")
    client.send(data)
    client.shutdown(socket.SHUT_WR)   # notify that nothing more is to be sent
    _ = client.recv(16)               # wait for the client to close when everything has been received
    client.close()                    # Ok, we can explicitely close
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...