#-*-coding=utf-8-*- import socket import time import binascii from multiprocessing import Process from logging_config import tcp_connector as logger SERVER_ADDRESS = ('172.16.3.0', 50227) # 客户端类定义 class ClientTemp(Process):#继承Process类 def __init__(self): super(ClientTemp, self).__init__() self.__sock = None self.__connected = False self.__stopped = False self.__ip = SERVER_ADDRESS[0] self.__port = SERVER_ADDRESS[1] self.__head = False def open(self): self.__stopped = False self.start() def run(self): self.__connect() self.__connected = True while True: self.__head = True # 测试,暂不发送头部信息 if self.__head == False: data1 = '3f08efbe020000002dc4' data2 = 'd107efbe0e0000000401040de982d9e80c12fd1b2101d307efbe00000000d107efbe0e0000000401040de982d9e80c12fd1b2101d307efbe00000000d107efbe0e0000000401040de982d9e80c12fd1b2101d307efbe00000000d107efbe0e0000000401040de982d9e80c12fd1b2101d307efbe00000000d107efbe0e0000000401040de982d9e80c12fd1b2101d307efbe00000000' data3 = 'd307efbe00000000d207efbe1600000001071303020100a10201020101a10201020102a10201' self.send_command(data1) self.send_command(data2) self.send_command(data3) self.__head = True else: data = 'd107efbe0e0000000401040de982d9e80c12fd1b2101' # print('temp_awake...........................') self.send_command(data) time.sleep(1) def send_command(self, command): if self.__connected: try: send_data = bytes.fromhex(command) self.__sock.send(send_data) except Exception as e: time.sleep(5) self.__reconnect() # logger.info(f'Send command to [{self.name}]:[{self.__ip}]:[{self.__port}] error:{e}') else: self.__reconnect() # 建立socket连接 def __connect(self): if self.__sock: self.__sock.close() self.__sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.__sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 允许重用本地地址和端口 self.__sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) # 在客户端开启心跳维护 self.__sock.settimeout(10) # 设置超时时间3mins try: self.__sock.connect((self.__ip, self.__port)) logger.info(f'Connect to [{self.name}]:[{self.__ip}]:[{self.__port}] success !') self.__connected = True except Exception as e: logger.info(f'Connect to [{self.name}]:[{self.__ip}]:[{self.__port}] failed:{e} !!!') self.__connected = False self.__reconnect() def __reconnect(self): while True: try: if self.__sock: self.__sock.close() self.__sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.__sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) self.__sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) # 在客户端开启心跳维护 self.__sock.settimeout(10) # 设置超时时间,单位:秒 self.__sock.connect((self.__ip, self.__port)) self.set_command_dict = {} self.__connected = True logger.info(f'Reconnect to [{self.name}]:[{self.__ip}]:[{self.__port}] success !') break except Exception as e: logger.info(f'Reconnect to [{self.name}]:[{self.__ip}]:[{self.__port}] failed:{e} !!! Continue reconnect in 5s..') self.__connected = False self.set_command_dict = {} time.sleep(5) # 接收服务器发送的数据 def receive_data(self): try: data = self.__sock.recv(self.status_len) except socket.timeout as e: logger.error(f"{self.name}: {e}") time.sleep(5) self.__reconnect() print('recv',e) except Exception as e: logger.error(f"{self.name}: {e}") time.sleep(5) self.__reconnect() # 启动客户端 if __name__ == '__main__': temp = ClientTemp() # 实例化进程对象 temp.start()