import json import logging import socketserver import socket import cv2 from ocr import ocr_util class MyTCPServer(socketserver.TCPServer): def __init__(self, server_address, RequestHandlerClass, bind_and_activate=True, pipe_juejin=None, pipe_ui=None): self.pipe_juejin = pipe_juejin # 增加的参数 self.pipe_ui = pipe_ui socketserver.TCPServer.__init__(self, server_address, RequestHandlerClass, bind_and_activate=bind_and_activate) # 如果使用异步的形式则需要再重写ThreadingTCPServer class MyThreadingTCPServer(socketserver.ThreadingMixIn, MyTCPServer): pass class MyBaseRequestHandle(socketserver.BaseRequestHandler): ocr_temp_data = {} def setup(self): super().setup() def handle(self): host = self.client_address[0] super().handle() # 可以不调用父类的handler(),方法,父类的handler方法什么都没做 # print("-------handler方法被执行----") # print(self.server) # print(self.request) # 服务 # print("客户端地址:", self.client_address) # 客户端地址 # print(self.__dict__) # print("- " * 30) # print(self.server.__dict__) # print("- " * 30) sk: socket.socket = self.request # 设置非阻塞 sk.setblocking(False) data = bytes() while True: try: temp_data = sk.recv(1024) if not temp_data: break data += temp_data except Exception as e: break _str = str(data, encoding="gbk") print("OCR SERVER 内容:", _str[0:20], "......", _str[-150:-1]) return_str = "OK" try: data = "" try: data = json.loads(_str) except: raise Exception("json解析失败") type = data["type"] if type == 100: data = data["data"] matId = data["matId"] index = data["index"] maxIndex = data["maxIndex"] cols = data["width"] rows = data["height"] key = data["key"] datas = data["data"] if self.ocr_temp_data.get(matId) is None: self.ocr_temp_data[matId] = [] self.ocr_temp_data[matId].extend(datas) if maxIndex == index: # 数据传输完成 datas = self.ocr_temp_data[matId] if rows * cols == len(datas): self.ocr_temp_data.pop(matId) mat = cv2.numpy.zeros((rows, cols, 1), cv2.numpy.uint8) for r in range(0, rows): for c in range(0, cols): mat[r][c] = [datas[r * cols + c]] # cv2.imwrite("D:/test.png", mat) ocr_results = ocr_util.OcrUtil.ocr_with_key(mat, key) # 图像识别 return_str = json.dumps({"code": 0, "data": {"datas": ocr_results}}) else: return_str = json.dumps({"code": 2, "msg": "数据出错"}) else: return_str = json.dumps({"code": 1, "msg": "数据尚未上传完"}) except Exception as e: if str(e).__contains__("json解析失败"): logging.error("OCR数据JSON解析解析失败") return_str = json.dumps({"code": -1, "msg": str(e)}) sk.send(return_str.encode()) def finish(self): super().finish()