python - 如何在python中将多维数组转换为字节和REVERSE?
问题描述
任务是通过客户端和服务器之间的套接字传输图像。服务器将图像转换为字节并通过套接字传输。客户端接收字节,但我找不到如何将它们转换回数组,我寻求帮助。
父类:
import threading
import socketserver
class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
pass
class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler):
def handle(self):
data = self.request.recv(1024)
self.server.queue.add(data)
class Queue:
def __init__(self, ip, port):
self.server = ThreadedTCPServer((ip, port), ThreadedTCPRequestHandler)
self.server.queue = self
self.server_thread = threading.Thread(target=self.server.serve_forever)
self.server_thread.daemon = True
self.messages = []
def start_server(self):
self.server_thread.start()
print("Server loop running in thread:", self.server_thread.name)
def stop_server(self):
self.server.shutdown()
self.server.server_close()
def add(self, message):
self.messages.append(message)
def view(self):
return self.messages
def get(self):
return self.messages.pop()
def exists(self):
return len(self.messages)
服务器父类:
import json
import socket
import time
from codex_queue import Queue
import cv2
class Server:
def __init__(self, ip, port):
self.queue = Queue(ip, port)
def start_server(self):
self.queue.start_server()
def stop_server(self):
self.queue.stop_server()
def loop(self):
Gaus_blur_kernel_size = 11
cap = cv2.VideoCapture(0)
ret, current_frame = cap.read()
previous_frame = current_frame
Gaus_kernel = (Gaus_blur_kernel_size, Gaus_blur_kernel_size)
# while True:
while(cap.isOpened()):
current_frame_gray = cv2.cvtColor(current_frame, cv2.COLOR_BGR2GRAY)
previous_frame_gray = cv2.cvtColor(previous_frame, cv2.COLOR_BGR2GRAY)
current_frame_gray = cv2.GaussianBlur(current_frame_gray, Gaus_kernel, 0)
previous_frame_gray = cv2.GaussianBlur(previous_frame_gray, Gaus_kernel, 0)
frame_diff = cv2.absdiff(current_frame_gray,previous_frame_gray)
self.send_img("localhost", 8889, frame_diff)#json.dumps(frame_diff))
#cv2.imshow('frame diff ', frame_diff)
if self.queue.exists():
self.handle(self.queue.get())
if cv2.waitKey(1) & 0xFF == ord('q'):
break
previous_frame = current_frame.copy()
ret, current_frame = cap.read()
cap.release()
cv2.destroyAllWindows()
def send_img(self, ip, port, img):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((ip, port))
try:
sock.sendall(bytes(img))
finally:
sock.close()
def handle(self, message):
"""
Prototype
"""
pass
客户端父类:
import socket
import time
from codex_queue import Queue
class Client:
def __init__(self, ip, port):
self.queue = Queue(ip, port)
def start_client(self):
self.queue.start_server()
def stop_client(self):
self.queue.stop_server()
def loop(self):
while True:
#time.sleep(1)
if self.queue.exists():
self.handle(self.queue.get())
def send(self, ip, port, message):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((ip, port))
try:
sock.sendall(bytes(message, 'ascii'))
finally:
sock.close()
def handle(self, message):
"""
Prototype
"""
pass
服务器类:
import json
import requests
from server import Server
import cv2
class Server_computer(Server):
def handle(self, message):
try:
print("Got {}".format(message))
url = json.loads(str(message, 'ascii'))["url"]
response = requests.get(url)
except Exception as e:
print("Error: {}".format(e))
else:
result = {}
result['status_code'] = response.status_code
self.send("localhost", 8889, json.dumps(result))
if __name__ == "__main__":
print("Server started.")
getter = Server_computer("localhost", 8887)
getter.start_server()
getter.loop()
getter.stop_server()
客户端类:
import cv2
from client import Client
class Client_listner(Client):
def handle(self, img):
try:
print("Got image")
int_values = [x for x in img]
print(int_values)
cv2.imshow('Getting image', int_values)
except Exception as e:
print("Error: {}".format(e))
if __name__ == "__main__":
print("Client started.")
app = Client_listner("localhost", 8889)
app.start_client()
app.loop()
app.stop_client()
解决方案
推荐阅读
- c# - 无法在 ASP.NET Core 3.1 MVC 中发送电子邮件进行确认
- bash - 使用 bash 脚本在另一个文件中创建具有两个或多个参数的文件
- python-3.x - 函数名调用时抛出 UnboundLocalError
- python - 如何修复 OSError: >;CG5= 在 python pybluez 套接字中?
- git - 如何仅输出 git commit id 中添加的新行?
- javascript - Chart.js 重复颜色?
- mysql - Mysql 数据透视连接失败
- node.js - 使用 Pino 作为 Sequelize 的记录器
- c# - 使用 C# 备份托管在服务器上的 SQL Server 数据库时出现问题
- html - VueJs 锚标记相对路径在我的系统中不起作用