Как заставить сервер и клиент отправлять картинки и сообщения друг другу, используя python -socket? - PullRequest
0 голосов
/ 10 марта 2020

Я использую этот код для отправки картинок с клиента на сервер, это не проблема.

server.py

import socket
import cv2
import pickle
import struct

HOST='127.0.0.1'
PORT=8485

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print('Socket created')

s.bind((HOST,PORT))
print('Socket bind complete')
s.listen(10)
print('Socket now listening')
conn,addr=s.accept()

data = b""
payload_size = struct.calcsize(">L")
print("payload_size: {}".format(payload_size))
while True:
    while len(data) < payload_size:
        print("Recv: {}".format(len(data)))
        data += conn.recv(4096)
    print("Done Recv: {}".format(len(data)))
    packed_msg_size = data[:payload_size]
    data = data[payload_size:]
    msg_size = struct.unpack(">L", packed_msg_size)[0]
    print("msg_size: {}".format(msg_size))
    while len(data) < msg_size:
        data += conn.recv(4096)
    frame_data = data[:msg_size]
    data = data[msg_size:]
    frame=pickle.loads(frame_data, fix_imports=True, encoding="bytes")
    frame = cv2.imdecode(frame, cv2.IMREAD_COLOR)
    cv2.imshow('ImageWindow',frame)
    cv2.waitKey(1)

client.py

import cv2
import socket
import struct
import pickle

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('127.0.0.1', 8485))
connection = client_socket.makefile('wb')
cam = cv2.VideoCapture(0)
img_counter = 0
encode_param = [int(cv2.IMWRITE_JPEG_QUALITY), 90]

while True:
    ret, frame = cam.read()
    result, frame = cv2.imencode('.jpg', frame, encode_param)
    data = pickle.dumps(frame, 0)
    size = len(data)
    print("{}: {}".format(img_counter, size))
    client_socket.sendall(struct.pack(">L", size) + data)
    img_counter += 1
cam.release()   

Отображение изображений с клиента на сервер. Вышеприведенный код работает без проблем.

Но теперь я хочу отправить изображения с клиента на сервер, сервер получает изображения клиента, затем обрабатывает изображения клиента, а затем отправляет обработанные изображения и серийный номер картинки для клиента, затем отображает картинки и серийный номер, возвращенные сервером на клиенте.

Итак, я написал следующий код, но теперь этот код не работает, где не так?

server_1.py

import socket
import cv2
import pickle
import struct

HOST='127.0.0.1'
PORT=8485
socketserver=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print('Socket created')

socketserver.bind((HOST,PORT))
print('Socket bind complete')
socketserver.listen(10)
print('Socket now listening')

clientsocket,addr=socketserver.accept()

data = b""
payload_size = struct.calcsize(">L")
print("payload_size: {}".format(payload_size))
img_counter = 1
while True:
    while len(data) < payload_size:
        print("Recv: {}".format(len(data)))
        data += clientsocket.recv(4096)

    print("Done Recv: {}".format(len(data)))
    packed_msg_size = data[:payload_size]
    data = data[payload_size:]
    msg_size = struct.unpack(">L", packed_msg_size)[0]
    print("msg_size: {}".format(msg_size))
    while len(data) < msg_size:
        data += clientsocket.recv(4096)
    frame_data = data[:msg_size]
    frame=pickle.loads(frame_data, fix_imports=True, encoding="bytes")
    frame = cv2.imdecode(frame, cv2.IMREAD_COLOR)
    cv2.imshow('ImageWindow',frame)

    image_to_client=frame.copy()
    cv2.putText(image_to_client, str(img_counter), (30, 100), cv2.FONT_HERSHEY_SIMPLEX, 4.0, 255, 5)
    to_client_data = pickle.dumps(image_to_client, 0)
    size = len(to_client_data)
    clientsocket.sendall(struct.pack(">L", size) + to_client_data)
    img_counter += 1
    cv2.waitKey(1)
    msg = str(img_counter)
    clientsocket.send(msg.encode("utf-8"))

client_1.py

import cv2
import socket
import struct
import pickle

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('127.0.0.1', 8485))
connection = client_socket.makefile('wb')
cam = cv2.VideoCapture(0)
img_counter = 1
encode_param = [int(cv2.IMWRITE_JPEG_QUALITY), 90]
rec_data = b""
payload_size = struct.calcsize(">L")
while True:
    ret, frame = cam.read()
    result, frame = cv2.imencode('.jpg', frame, encode_param)
    data = pickle.dumps(frame, 0)
    size = len(data)
    print("{}: {}".format(img_counter, size))
    client_socket.sendall(struct.pack(">L", size) + data)
    img_counter += 1
    while len(rec_data) < payload_size:
        print("Recv: {}".format(len(rec_data)))
        rec_data += client_socket.recv(4096)
    print("Done Recv: {}".format(len(rec_data)))
    packed_msg_size = rec_data[:payload_size]
    rec_data = rec_data[payload_size:]
    msg_size = struct.unpack(">L", packed_msg_size)[0]
    print("msg_size: {}".format(msg_size))
    while len(rec_data) < msg_size:
        rec_data += client_socket.recv(4096)
    frame_data = rec_data[:msg_size]
    rec_frame = pickle.loads(frame_data, fix_imports=True, encoding="bytes")
    rec_frame = cv2.imdecode(rec_frame, cv2.IMREAD_COLOR)
    cv2.imshow('ClientReceiveImg', rec_frame)
    cv2.waitKey(1)
    msg = client_socket.recv(1024)
    print(msg.decode("utf-8"))
cam.release()

Сообщение об ошибке:

Ошибка OpenCV: Ошибка подтверждения (size.width> 0 && size.height> 0) в файле cv :: imshow, файл D: \ Build \ OpenCV \ opencv-3.3.1 \ modules \ highgui \ src \ window. cpp, строка 339

client_1.py 35 cv2.imshow ('ClientReceiveImg', rec_frame)

cv2.error: D: \ Build \ OpenCV \ ope ncv-3.3.1 \ modules \ highgui \ src \ window. cpp: 339: ошибка: (-215) size.width> 0 && size.height> 0 в функции cv :: imshow

...