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()
|