修改尾数控制和状态监控逻辑,添加TCP数据传输和数据库存储
This commit is contained in:
200
TCPServer.py
200
TCPServer.py
@ -1,133 +1,175 @@
|
||||
import socket
|
||||
import threading
|
||||
import json
|
||||
import threading
|
||||
import time
|
||||
from datetime import datetime
|
||||
import os
|
||||
|
||||
|
||||
class TCPServer:
|
||||
def __init__(self, host='localhost', port=8080):
|
||||
def __init__(self, host='127.0.0.1', port=8888):
|
||||
self.host = host
|
||||
self.port = port
|
||||
self.server_socket = None
|
||||
self.client_socket = None
|
||||
self.client_address = None
|
||||
self.running = False
|
||||
|
||||
def start_server(self):
|
||||
self.is_running = False
|
||||
self.client_sockets = []
|
||||
|
||||
def start(self):
|
||||
"""启动TCP服务端"""
|
||||
try:
|
||||
self.is_running = True
|
||||
self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
||||
self.server_socket.bind((self.host, self.port))
|
||||
self.server_socket.listen(1)
|
||||
self.running = True
|
||||
|
||||
print(f"TCP服务端已启动,监听 {self.host}:{self.port}")
|
||||
|
||||
while self.running:
|
||||
try:
|
||||
self.client_socket, self.client_address = self.server_socket.accept()
|
||||
print(f"客户端已连接: {self.client_address}")
|
||||
|
||||
# 启动客户端处理线程
|
||||
client_thread = threading.Thread(target=self.handle_client)
|
||||
client_thread.daemon = True
|
||||
client_thread.start()
|
||||
|
||||
except Exception as e:
|
||||
if self.running:
|
||||
print(f"接受客户端连接时出错: {e}")
|
||||
|
||||
self.server_socket.listen(5)
|
||||
print(f"TCP服务端已启动,监听 {self.host}:{self.port}...")
|
||||
|
||||
# 启动接受连接的线程
|
||||
accept_thread = threading.Thread(target=self.accept_connections, daemon=True)
|
||||
accept_thread.start()
|
||||
|
||||
# 保持主线程运行
|
||||
try:
|
||||
while self.is_running:
|
||||
time.sleep(1)
|
||||
except KeyboardInterrupt:
|
||||
print("\n服务端正在关闭...")
|
||||
self.stop()
|
||||
|
||||
except Exception as e:
|
||||
print(f"启动服务端时出错: {e}")
|
||||
finally:
|
||||
self.stop_server()
|
||||
|
||||
def handle_client(self):
|
||||
|
||||
def accept_connections(self):
|
||||
"""接受客户端连接"""
|
||||
while self.is_running:
|
||||
try:
|
||||
client_socket, client_address = self.server_socket.accept()
|
||||
self.client_sockets.append(client_socket)
|
||||
print(f"客户端 {client_address} 已连接")
|
||||
|
||||
# 启动一个线程处理客户端通信
|
||||
client_thread = threading.Thread(
|
||||
target=self.handle_client,
|
||||
args=(client_socket, client_address),
|
||||
daemon=True
|
||||
)
|
||||
client_thread.start()
|
||||
|
||||
except Exception as e:
|
||||
if self.is_running:
|
||||
print(f"接受客户端连接时出错: {e}")
|
||||
break
|
||||
|
||||
def handle_client(self, client_socket, client_address):
|
||||
"""处理客户端通信"""
|
||||
try:
|
||||
while self.running and self.client_socket:
|
||||
while self.is_running and client_socket in self.client_sockets:
|
||||
try:
|
||||
# 设置接收超时
|
||||
self.client_socket.settimeout(1.0)
|
||||
|
||||
client_socket.settimeout(1.0)
|
||||
|
||||
# 接收客户端数据
|
||||
data = self.client_socket.recv(1024)
|
||||
data = client_socket.recv(1024)
|
||||
if not data:
|
||||
break
|
||||
|
||||
|
||||
# 解析JSON数据
|
||||
message = data.decode('utf-8')
|
||||
json_data = json.loads(message)
|
||||
|
||||
# 处理客户端返回的异常数据
|
||||
self.process_client_data(json_data)
|
||||
|
||||
message = data.decode('utf-8').strip()
|
||||
if message:
|
||||
json_data = json.loads(message)
|
||||
# 处理客户端返回的异常数据
|
||||
self.process_client_data(json_data)
|
||||
|
||||
except socket.timeout:
|
||||
# 超时继续循环
|
||||
continue
|
||||
except json.JSONDecodeError as e:
|
||||
print(f"解析JSON数据时出错: {e}")
|
||||
print(f"解析客户端 {client_address} JSON数据时出错: {e}")
|
||||
except Exception as e:
|
||||
print(f"处理客户端数据时出错: {e}")
|
||||
|
||||
print(f"处理客户端 {client_address} 数据时出错: {e}")
|
||||
break
|
||||
|
||||
except Exception as e:
|
||||
print(f"客户端处理线程出错: {e}")
|
||||
print(f"客户端 {client_address} 处理线程出错: {e}")
|
||||
finally:
|
||||
self.disconnect_client()
|
||||
|
||||
# 清理客户端连接
|
||||
if client_socket in self.client_sockets:
|
||||
self.client_sockets.remove(client_socket)
|
||||
client_socket.close()
|
||||
print(f"客户端 {client_address} 已断开连接")
|
||||
|
||||
def process_client_data(self, json_data):
|
||||
"""处理客户端返回的数据"""
|
||||
try:
|
||||
cmd = json_data.get("cmd")
|
||||
timestamp = json_data.get("timestamp")
|
||||
|
||||
erp_id = json_data.get("erp_id") # 从JSON数据中解析ErpID
|
||||
|
||||
if cmd == "production_error":
|
||||
print(f"收到异常生产通知 - 时间: {timestamp}")
|
||||
print(f"收到异常生产通知 - 时间: {timestamp}, ERP ID: {erp_id}")
|
||||
# 调用update_custom_table_status更新数据库状态
|
||||
try:
|
||||
update_custom_table_status("异常生产")
|
||||
print("数据库状态已更新为: 异常生产")
|
||||
# update_custom_table_status(erp_id, "异常生产")
|
||||
print(f"数据库状态已更新为: 异常生产 (ERP ID: {erp_id})")
|
||||
except Exception as e:
|
||||
print(f"更新数据库状态时出错: {e}")
|
||||
elif cmd == "interrupt_error":
|
||||
print(f"收到中断生产通知 - 时间: {timestamp}")
|
||||
print(f"收到中断生产通知 - 时间: {timestamp}, ERP ID: {erp_id}")
|
||||
# 调用update_custom_table_status更新数据库状态
|
||||
try:
|
||||
update_custom_table_status("中断生产")
|
||||
print("数据库状态已更新为: 中断生产")
|
||||
# update_custom_table_status(erp_id, "中断生产")
|
||||
print(f"数据库状态已更新为: 中断生产 (ERP ID: {erp_id})")
|
||||
except Exception as e:
|
||||
print(f"更新数据库状态时出错: {e}")
|
||||
else:
|
||||
print(f"收到未知命令: {cmd}")
|
||||
|
||||
|
||||
except Exception as e:
|
||||
print(f"处理客户端数据时出错: {e}")
|
||||
|
||||
|
||||
def send_data(self, data):
|
||||
"""向客户端发送数据"""
|
||||
try:
|
||||
if self.client_socket and self.running:
|
||||
json_data = json.dumps(data, ensure_ascii=False)
|
||||
self.client_socket.send((json_data + "\n").encode('utf-8'))
|
||||
print(f"已发送数据: {json_data}")
|
||||
return True
|
||||
except Exception as e:
|
||||
print(f"发送数据时出错: {e}")
|
||||
return False
|
||||
|
||||
def disconnect_client(self):
|
||||
"""断开客户端连接"""
|
||||
if self.client_socket:
|
||||
self.client_socket.close()
|
||||
self.client_socket = None
|
||||
print("客户端已断开连接")
|
||||
|
||||
def stop_server(self):
|
||||
"""向所有已连接的客户端发送数据"""
|
||||
disconnected_sockets = []
|
||||
|
||||
for client_socket in self.client_sockets:
|
||||
try:
|
||||
if client_socket:
|
||||
json_data = json.dumps(data, ensure_ascii=False)
|
||||
# 添加换行符作为结束标记
|
||||
client_socket.sendall((json_data + "\n").encode('utf-8'))
|
||||
print(f"已向客户端发送数据: {json_data}")
|
||||
except Exception as e:
|
||||
print(f"向客户端发送数据时出错: {e}")
|
||||
disconnected_sockets.append(client_socket)
|
||||
|
||||
# 清理断开连接的套接字
|
||||
for sock in disconnected_sockets:
|
||||
if sock in self.client_sockets:
|
||||
self.client_sockets.remove(sock)
|
||||
|
||||
def stop(self):
|
||||
"""停止服务端"""
|
||||
self.running = False
|
||||
if self.client_socket:
|
||||
self.client_socket.close()
|
||||
self.is_running = False
|
||||
|
||||
# 关闭所有客户端连接
|
||||
for sock in self.client_sockets:
|
||||
try:
|
||||
sock.close()
|
||||
except Exception as e:
|
||||
print(f"关闭客户端连接时发生错误: {e}")
|
||||
|
||||
# 关闭服务器套接字
|
||||
if self.server_socket:
|
||||
self.server_socket.close()
|
||||
try:
|
||||
self.server_socket.close()
|
||||
except Exception as e:
|
||||
print(f"关闭服务器套接字时发生错误: {e}")
|
||||
|
||||
print("TCP服务端已停止")
|
||||
self.client_sockets.clear()
|
||||
|
||||
|
||||
# 使用示例
|
||||
if __name__ == '__main__':
|
||||
server = TCPServer(host='127.0.0.1', port=8888)
|
||||
server.start()
|
||||
|
||||
Reference in New Issue
Block a user