Попросите программу отправить данные на устройство и, если это не удастся, дождитесь повторного подключения устройства - PullRequest
0 голосов
/ 30 октября 2019

Я пытаюсь собрать программу, в которой при добавлении файла с определенным именем программа отправляет данные этого файла на устройство в моей сети. Проблема в том, что устройство, на которое я пытаюсь отправить данные, обычно отключается. Это может привести к сбою моей программы. Я хочу, чтобы программа попыталась отправить данные на устройство, и, если это невозможно, дождаться повторного подключения устройства.

Вот моя программа:

import time, socket, os, sys, select, datetime
IP = '10.0.0.248'


LOGFILE = '/path/to/logfile.txt'
INFILE = '/path/to/datafile.txt'

def main():
    while True:
        try:
            messages = []
            sent = []
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.bind((IP, 3011))
            s.listen(1)
            with open(LOGFILE, 'a') as logfile:
                curr_datetime = datetime.datetime.now()
                curr_time = '{}'.format(curr_datetime.strftime("%a, %d-%b-%Y %H:%M:%S"))
                logfile.write(f'{curr_time}\tListening for connection on {IP}:{PORT}\n\n')
            c, addr = s.accept()
            with open(LOGFILE, 'a') as logfile:
                logfile.write(f'Accepted connection from {addr}')
            with open(INFILE, 'r') as infile:
                for line in infile:
                    messages.append(line.strip('\n').strip('\'').strip('"'))
            with open(INFILE, 'w') as infile:
                infile.write('')
            for message in messages:
                try:
                    s.send(bytes(message, "utf-8"))
                    sent.append(message)    
                except KeyboardInterrupt:
                    s.close()
                    sys.exit()
                except Exception as e:
                    with open(LOGFILE, 'a') as logfile:
                        logfile.write(f'Failed to send message {message} to {addr}: {e}')
                    pass
            for message in sent:
                del messages[messages.index(message)]
            sent = []

        except KeyboardInterrupt:
            s.close()
            sys.exit()
        except Exception as e:
            curr_datetime = datetime.datetime.now()
            curr_time = '{}'.format(curr_datetime.strftime("%a, %d-%b-%Y %H:%M:%S"))
            err_details = str('Error in line {}'.format(sys.exc_info()[-1].tb_lineno), type(e).__name__, e)
            with open(LOGFILE, 'a') as logfile:
                logfile.write(f'{curr_time} - Exception: {e}\n\n')
            pass


if __name__ == "__main__":
    main()

Что мне нужно сделать по-другому, чтобы, когда клиентское соединение (устройство) отключалось от сокета, моя программа ожидала, пока устройство не подключится к нему? Любая помощь будет принята с благодарностью!

...