self.dest = (self.host, self.port)
def stop(self):
# Método para interromper a thread do cliente.
self.running = False
self.sock.close()
def _send(self, cmd):
# Método para envio de comandos para o servidor.
self.cmd = cmd
try:
self.sock.send(self.cmd)
except:
return False
def run(self):
# Método obrigatório para a thread aceitar ativação através de 'start()'.
# Ativa o cliente socket.
try:
self.sock.connect(self.dest)
# Loop infinito para manter a execução do cliente
while self.running:
# Enviando mensagem para verificar se a conexão está integra
self.sock.send('KeepAlive ' + timestamp('hmsms')
time.sleep(1)
except:
self.stop()
return False
def timestamp(tipo):
""" Funcao para gerar timestamp de uso geral """
if tipo == 'hmsms':
return str('{0:%H%M%S%f}'.format(datetime.datetime.now()))[0:9]
elif tipo == 'ms':
return str('{:%f}'.format(datetime.datetime.now()))[0:3]
# Chamada para camada de comunicação socket
if __name__ == "__main__":
os.system('clear')
# Criando variáveis de ambiente e verificando diretórios.
# Detectando em qual diretório a aplicação está sendo executada
dir_atual = os.getcwd()
# Verificando se existe o diretório de 'log'.
# Se não existir - Criar.
log_dir = dir_atual + '/log'
if not os.path.exists(log_dir):
os.mkdir(log_dir)
# Criando o arquivo 'simul.log'.
nome_arq_log = log_dir + '/' + 'sock_' + timestamp('hmsms') + '.log'
with open(nome_arq_log, 'w') as arq_log:
arq_log.write('\n')
# Variável com o nome da aplicação
nome_prog = sys.argv[0].split('./')[1]
# Ajustando recursos de logging
logger = logging.getLogger(nome_prog)
handler = logging.FileHandler(nome_arq_log)
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
# Setando para debug
logger.setLevel(logging.DEBUG)
# CONFIGURAÇÃO DO SERVIDOR
# Endereço IP da máquina LOCAL
ip_local = ''
port_local = 50000
# CONFIGURAÇÃO DO CLIENTE
# Endereço IP da máquna REMOTA
ip_remoto = '192.168.1.100'
port_remoto = 40000
# Chamada da função de conexão
try:
while True:
running = True
status_conexao_ini = ''
try:
while running:
# Rotina de ativação do servidor local 'tutor'
# --------------------------------------------
try:
if not servidor.isAlive() and running:
servidor.stop()
servidor = SockServer(ip_local, port_local)
servidor.start()
except:
if running:
servidor = SockServer(ip_local, port_local)
servidor.start()
# Rotina de ativação do cliente 'sage'
# ------------------------------------
try:
# Verificando o status inicial do cliente.
stat_cliente_ini = cliente.isAlive()
# Caso a thread do cliente exista mas esteja inativa -> ativar.
# Na primeira execução ocorrerá um erro que será tratado por 'except'.
if not cliente.isAlive() and running:
cliente.stop()
cliente = SockClient(ip_remoto, port_remoto)
cliente.start()
# Verificando o status atual do cliente.
stat_cliente_atu = cliente.isAlive()
# Determinando se o cliente esta conectado.
if stat_cliente_ini == True and stat_cliente_atu == True:
status_conexao_atu = "Conectado"
else:
status_conexao_atu = "Desconectado"
# Informando o status do cliente somente quando há transição de estados
if status_conexao_ini != status_conexao_atu:
status_conexao_ini = status_conexao_atu
# Formatando mensagens de log
if status_conexao_ini == "Desconectado":
logger.critical('- Sem conexão com o servidor remoto.')
elif status_conexao_ini == "Conectado":
logger.info(' - Conexão estabelecida com o servidor remoto.')
except:
if running:
cliente = SockClient(ip_remoto, port_remoto)
cliente.start()
time.sleep(4)
except:
running = False
servidor.stop()
cliente.stop()
except KeyboardInterrupt: