def new_func(*args, **kwargs): logger.info( f'Функции {old_func.__name__}() вызвана из функции {inspect.stack()[1][3]}' ) result = old_func(*args, **kwargs) return result
def presence_response(self): """ Формирование ответа клиенту :param presence_message: Словарь presence запроса :return: Словарь ответа """ # Делаем проверки if ACTION in self.presence and \ self.presence[ACTION] == PRESENCE and \ TIME in self.presence and \ isinstance(self.presence[TIME], float): # Если всё хорошо шлем ОК logger.info('Клиент подключён.') return {RESPONSE: 200} else: # Шлем код ошибки logger.error('Не верный запрос.') return {RESPONSE: 400, ERROR: 'Не верный запрос'}
def read_requests(self): # Чтение запросов из списка клиентов responses = {} # Словарь ответов сервера вида {сокет: запрос} for sock in self.r: try: data = JimRcv(sock).get_message() logger.debug(f'Получили сообщение от клиента: {data}') # responses[sock] = data for sock2 in self.w: responses[sock2] = data logger.debug(f'Отпраляем словарь ответов сервера: {responses}') except: print('Клиент {} {} отключился'.format(sock.fileno(), sock.getpeername())) logger.info('Клиент {} {} отключился'.format( sock.fileno(), sock.getpeername())) self.clients.remove(sock) return responses
def new_func(*args, **kwargs): logger.info(f'Имя функции: {old_func.__name__}') logger.info(f'Параметры по имени: {args}') # logger.debug(f'Параметры по названию: {kwargs}') result = old_func(*args, **kwargs) logger.info(f'Результат {result}') return result
def write_responses(self): # Эхо-ответ сервера клиентам, от которых были запросы for sock in self.w: if sock in self.requests: try: if self.requests[sock][ACTION] == 'get_contacts': Server.get_contacts(self, sock) elif self.requests[sock][ACTION] == 'write': # Подготовить и отправить ответ сервера resp = { RESPONSE: 200, 'message': self.requests[sock]['message'] } JimSend(sock).send_message(resp) logger.debug( f'Отвера сервера был отправлен клинету {sock.fileno()} {sock.getpeername()}' ) except: # Сокет недоступен, клиент отключился print('Клиент {} {} отключился'.format( sock.fileno(), sock.getpeername())) logger.info('Клиент {} {} отключился'.format( sock.fileno(), sock.getpeername())) sock.close() self.clients.remove(sock)
def __init__(self): address = ('', 8888) try: addr = sys.argv[1] except IndexError: addr = '' try: port = int(sys.argv[2]) except IndexError: port = 8888 except ValueError: print('Порт должен быть целым числом') sys.exit(0) self.clients = [] self.s = socket(AF_INET, SOCK_STREAM) # TODO что такое bind, и зачем он нужен self.s.bind(address) self.s.listen(100) self.s.settimeout(0.2) # Таймаут для операций с сокетом while True: try: self.conn, self.addr = self.s.accept() # Проверка подключения logger.debug('Проверка подключения прошла успешно.') # Получаем сообщение от клиента self.presence = JimRcv(self.conn).get_message() logger.debug( f'Сообщение от клиента было получено: {self.presence}') # Формируем ответ response = Server.presence_response(self) logger.debug(f'Клинту был сформирован ответ: {response}') # Отправляем ответ клиенту JimSend(self.conn).send_message(response) logger.info(f'Клиенту был отправлен ответ: {response}') self.connect_to_db() # Выполним вход Server.login(self) sender = TimeServer(self.conn, 5) th_sender = Thread(target=sender) th_sender.start() except OSError as e: pass # timeout Вышел else: self.clients.append(self.conn) finally: # Проверяю наличие событий ввода-вывода self.wait = 0 self.r = [] self.w = [] try: self.r, self.w, self.e = select.select( self.clients, self.clients, [], self.wait) # print('r | ', self.r) # print('w | ', self.w) # r делают send # w делают read except: pass self.requests = Server.read_requests( self) # Сохраним запросы клиентов Server.write_responses( self) # Выполним отправку ответов клиентам