def connect(self): ''' организация соединения, создание сообщения серверу :return: ''' self.sock = socket(AF_INET, SOCK_STREAM) self.sock.connect((option.address, option.port)) print('GOOD! соединение установлено... ') # формируем json данные приветствия и посылаем их серверу presence[USER][ACCOUNT_NAME] = option.user send_msg(self.sock, presence) print('послали данные приветствия... ') # принимаем данные (подтверждение) от сервера response = get_msg(self.sock) # print('приняли ответ от сервера') if response: print("YATA! =) Принята проверка от сервера: %s\n" % response) else: print("Нет ответа от сервера, что-то пошло не так...\n") # проверяем ответ и возвращем его # result_response = check_response(response) return response
def mainloop(): #inputs = [server] global inputs inputs = {} outputs = [] global conn conn = '' ''' Основной цикл обработки запросов клиентов ''' ################################################## while True: try: # принимаем запросы на соединение conn, addr = server.accept() # принимаем приветствие от клиентов presence = get_msg(conn) print('... получено приветствие от клиента: %s' % presence) # DEBUG # проверяем тип сообщения chk_presence = check_msg(presence) # если тип - привествие - посылем код ответа клиенту if chk_presence: response['status'] = OK conn_user = presence['user']['account_name'] response['to'] = conn_user print('... отправляем ответ клиенту на приветствие ...') print('response: %s' % response) send_msg(conn, response) global user user = presence['user']['account_name'] else: print('<AHTUNG> some problem with presence...') except OSError as e: pass # Таймаут вышел else: print( "<<||>> Получен запрос на соединение от {}, user: {}".format( str(addr), conn_user)) # добавляем входящее соединение в список (словарь!) ## + печатаем список соединений с пользователем inputs.update({conn: conn_user}) for k, u in inputs.items(): print('INPUTS: {}:{}'.format(k, u)) finally: # проверка событий ввода-вывода wait = 0 readable = [] writible = [] try: readable, writable, exceptional = select.select( inputs, inputs, [], wait) except: pass # ничего не делаем, если клиент отключился requests = read_messages(readable, inputs) # принимаем сообщения send_messages(requests, writable, inputs) # отправляем сообщения всем
def mainloop(): inputs = [server] outputs = [] ''' Основной цикл обработки запросов клиентов ''' ################################################## while True: try: # принимаем запросы на соединение conn, addr = server.accept() # принимаем приветствие от клиентов presence = get_msg(conn) print('... получено приветствие от клиента: %s' % presence) # DEBUG # проверяем тип сообщения chk_presence = check_msg(presence) # если тип - привествие - посылем код ответа клиенту if chk_presence: response['status'] = OK response['to'] = presence['user']['account_name'] print('... отправляем ответ клиенту на приветствие ...') print('response: %s' % response) send_msg(conn, response) global user user = presence['user']['account_name'] else: print('<AHTUNG> some problem with presence...') except OSError as e: pass # Таймаут вышел else: print("<<||>> Получен запрос на соединение от %s" % str(addr)) # добавляем входящее соединение в список inputs.append(conn) finally: # проверка событий ввода-вывода wait = 0 readable = [] writible = [] try: readable, writable, exceptional = select.select( inputs, inputs, [], wait) except: pass # ничего не делаем, если клиент отключился requests = read_messages(readable, inputs) # принимаем сообщения send_messages(requests, writable, inputs) # отправляем сообщения всем
def read_messages(read_clients, all_clients): # входящие сообщения messages = [] for s in read_clients: try: # получаем входящие сообщения и добавляем в список inc_msg = get_msg(s) messages.append(inc_msg) print(22) except: print('UPS! клиент {}{} отключился'.format(s.fileno(), s.getpeername())) all_clients.remove(s) return messages # возвращаем список сообщений
def write_messages(self): # основной цикл (работа с сообщениями) if option.write_client == 'yes': while True: # посылаем сообщение в чат (общий) в цикле my_msg = input( '==> Вы хотите отправить сообщение (y)? получить лист контактов (list)? Для выхода жми exit!(e): ' ) if my_msg == 'y': # Определяем адресата сообщения chat_msg[TO] = input('Кому отправить сообщение: ') # формируем сообщение в словарь chat_msg[MESSAGE] = input('Введите текст сообщения: ') # посылаем словарь серверу chat_msg[FROM] = option.user print('message_test: %s' % chat_msg) send_msg(self.sock, chat_msg) # получаем список контактов elif my_msg == 'list': try: #put_contacts[TO] = option.user contacts = self.get_cont() print(contacts) # debug except Exception as e: print(e) elif my_msg == 'e': print('EXIT!') self.sock.close() exit() else: print('ошибка при отправлении сообщения в чат\n') self.sock.close() exit() while True: # принимаем сообщения из чата if option.read_client == 'yes': while True: print('ОК, ждём входящих') response = get_msg(self.sock) # print('p_1') print('входящее сообщение: "%s"' % response) print('p_10')
def read_messages(read_clients, all_clients): messages = [] resp_msg = '' for s in read_clients: print('read_clients: %s' % s) try: print(143) ############## Получаем и обрабатываем входящие сообщения ############# inc_msg = get_msg(s) # проверяем тип сообшения (поле action) msg_type = check_msg(inc_msg) print('===> тип сообшения: %s <===' % msg_type) #DEBUG ## обрабатываем получение списка контактов if msg_type == 'get_contacts': print('====> получено от клиента: %s <====' % inc_msg) ## формируем контакт лист для клиента # print('user: %s' %user) contact_list = Repo.friends_lst(user) #print('also, contact_list:: %s: ' %contact_list) ## формируем контакт лист для клиента put_contacts['contacts_list'] = contact_list put_contacts[TO] = inc_msg['from'] #resp_msg = contact_list resp_msg = put_contacts #print('сформировали ответ клиенту :%s' %contact_list) print('сформировали ответ клиенту :%s' % resp_msg) ## Если тип message - просто ставим в очередь if msg_type == 'message': resp_msg = inc_msg print(155) ## добавляем сообщение в список messages.append(resp_msg) #print('messages_query_1 {|||||} : %s' %messages) except Exception as e: print('UPS_1! клиент {}{} отключился'.format( s.fileno(), s.getpeername())) print(e) all_clients.remove(s) return messages # возвращаем список сообщений
def get_cont(self): # формируем запрос севреру на получение контактов get_contacts[FROM] = option.user try: ## получаем контакты от сервера send_msg(self.sock, get_contacts) print('послали запрос контактов... ') except Exception as e: print('EXCP: %s' % e) response = get_msg(self.sock) print('приняли ответ от сервера на запрос контактов') if response: print("YATA! =) Принят лист контактов от сервера: %s\n" % response) else: print("Нет ответа от сервера, что-то пошло не так...\n") # проверяем ответ и возвращем его # result_response = check_response(response) return response
sock.connect((option.address, option.port)) # Соединиться с сервером print('соединение установлено... ') ### принимаем текущее время ### tm = sock.recv(4096) ### print("Текущее время: %s" % tm.decode('ascii')) ## текущее время ## timestamp = time.ctime(time.time()) + "\n" ##conn.send(timestamp.encode('ascii')) ''' формируем json данные приветствия и посылаем их серверу ''' presence[USER][ACCOUNT_NAME] = option.user send_msg(sock, presence) print('послали данные приветствия... ') ''' принимаем данные (подтверждение) от сервера ''' response = get_msg(sock) #print('приняли ответ от сервера') if response: print("YATA! =) Принята проверка от сервера: %s\n" % response[RESPONSE]) else: print("Нет ответа от сервера, что-то пошло не так...\n") # проверяем ответ result = check_response(response) if result == 200: # основной цикл (работа с сообщениями) if option.write_client == 'yes': while True: # посылаем сообщение в чат (общий) в цикле my_msg = input(
timestr = time.ctime(time.time()) + "\n" # Обратите внимание, дальнейшая работа ведётся с сокетом клиента client.send( timestr.encode('ascii') ) # <-по сети должны передаваться байты,поэтому выполняется кодирование строки # ''' # получаем данные от клиента (debug) # ''' # rec = client.recv(1024) # rc_mess = rec.decode('utf-8') # # if rec: # print('>> получено от клиента: {} <<'.format(rc_mess)) # else: # print('нет данных от клиента_1') # Получаем сообщение от клиента presence = get_msg(client) # print(presence) # DEBUG # Проверяем сообщение (приветствие) и формируем ответ response = check_pres(presence) # print(response) # DEBUG # Отсылаем код проверки клиенту if response: print('всё ОК, приветствие получено. отправляем ответ клиенту') send_msg(client, response) else: print('ups, что-то пошло не так :)') server.close()
def mainloop(): addres = (option.address, option.port) clients = [] sock = new_listen_socket(addres) ''' Основной цикл обработки запросов клиентов ''' ############################################################## # сам цикл проверки while True: try: # Принять запрос на соединение conn, addr = sock.accept() ## посылаем текущее время ## timestamp = time.ctime(time.time()) + "\n" ## conn.send(timestamp.encode('ascii')) # принимаем сообщение от клиентов (presence) presence = get_msg(conn) print('presence: %s' % presence) # DEBUG # проверяем тип сообщения response = check_pres(presence) # если тип - привествие - посылем код ответа клиенту if response: # print('...приветствие получено. отправляем ответ клиенту') send_msg(conn, response) else: print('ups, что-то пошло не так :)') except OSError as e: pass # Таймаут вышел else: print("Получен запрос на соединение от %s" % str(addr)) clients.append(conn) # Добавляем соединения в список print(10) # DEBUG finally: # Проверка наличия соединений (ввод-вывод) без таймаута outputs = [] inputs = [sock] try: r, w, e = select.select(inputs, clients, inputs) except Exception as e: pass # Ничего не делаем, если клиент отключится #print(11) # Обходим список клиентов, посылающих данные в сокет for w_client in w: print('current write connect: %s' % w_client) # DEBUG try: # принимаем сообщение от клиента (для чата) input_msg = get_msg(w_client) # проверяем тип сообщения (msg_chat) resp_msg = check_msg(input_msg) print('bzz2: %s' % resp_msg) # DEBUG if resp_msg: #print('YATAA! :) входящее сообщение (raw): %s\n' % input_msg) print('-------------------------- TADA! New message ---------------------------------') print('from: %s' % input_msg[FROM]) print('to: %s'% input_msg[TO]) print('time: %s' % TIMESTAMP) print('------- body message --------') print(' MESSAGE: %s' % input_msg[MESSAGE]) print('--------------------------- END message -----------------------------------') # теперь надо переслать всем клиентам из списка подключенных :) else: print('нет ответа от клиента') except: # Удаляем клиента, который отключился clients.remove(w_client) #print(13) # Проверка соединений, читающих сообщения из сокета for r_client in r: print('current read connect: %s' % r_client) # DEBUG # отсылаем сообщения всем клиентам, читающим из сокета try: # принимаем сообщение от клиента (для чата) input_msg = get_msg(r_client) # проверяем тип сообщения (msg_chat) resp_msg = check_msg(input_msg) if input_msg: print('посылаем сообщения списку') send_msg(r_client,input_msg) else: print('не можем послать сообщения. список пуст?') except: # Удаляем клиента, который отключился clients.remove(r_client)