2013-06-23 3 views
1

Я закодировал базовую систему сокетов с «select». Я хочу получить список подключенных клиентов мгновенно.Socket refresh python

Когда тайм-аут «выберите» прошло и несколько клиентов приходят после того, как, это драма ..

Пример - проблемы: У меня есть 3 клиентов с тем, который соединяет до истечения времени ожидания, 2 других подключены после тайм-аут, поэтому я собираюсь обновить свой список, если он принял во внимание двух других клиентов после таймаута.

1-й результат: я показываю свой переменный «список», я вижу первый сокет, который подключен до таймаута + один из другого сокета, который подключен после таймаута. Всего: 2 из 3 клиентов

второго результата: Я до сих пор повторно отобразить мой переменный «список», а три клиента есть ....

Но я хочу, чтобы список без необходимости повторного отображения перечислите каждый раз для каждого клиента, которого вы можете себе представить, у меня есть 10 клиентов, и я должен показать свой список10 раз

Итак, я подумал использовать модуль асинхронности, который более жидкий, что вы думаете? У вас есть решение для меня (проще)? Должен ли я использовать многопоточность или оставаться на асинхронном или выбрать модуль?

EDIT ИСХОДНЫЙ КОД:

import socket, select 

hote = '' 
port = 81 

mainConnection = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
mainConnection.bind((hote, port)) 
mainConnection.listen(5) 
print("Listen to {}".format(port)) 

client_online = [] 

while True: 

    connection_access, wlist, xlist = select.select([mainConnection], [], [], 10) 

    for connexion in connection_access: 
     connection_client, infos_connexion = connexion.accept() 
     client_online.append(connection_client) 



    refresh = input(">>> ") 

    while True: 
     try: 
      refresh = int(refresh) 
     except ValueError: 
      print("Not allowed") 
      refresh = int(refresh) 
     else: 
      break 

    if refresh == 1: 
     print("List client : {}".format(client_online)) 
+0

'select' должен возвращаться, когда по крайней мере один из сокетов в наборах готов. –

+0

нет:/i должен вернуть список 2 раза для шоу 3 клиента ... – Wiz

+0

Пожалуйста, покажите код, который вы используете, или, по крайней мере, [SSCCE] (http://sscce.org/). –

ответ

1

Есть три основные проблемы, связанные с вашим кодом:

  1. Вы называете input в цикле. Эта функция будет блок до ENTER нажат.

  2. Если нечетное число вводится с консоли, вы получите исключение. Вы обрабатываете это исключение, но вы справляетесь с этим неправильно. Вместо этого или попросите ввести снова, просто попробуйте выполнить ту же операцию, которая вызвала исключение.

  3. Вы проверяете только входящее соединение в своем звонке select. Вы никогда не проверяете, что какой-либо из подключенных сокетов отправил что-либо.

Основная проблема здесь для вас является вызов input, как он будет полностью остановить программу до ввода в консоли не вводится.

+0

Ok Спасибо! Итак, как я могу сделать для вызова ввода? – Wiz

+0

@Wiz Добавить ['sys.stdin'] (http://docs.python.org/2/library/sys.html#sys.stdin) в read-set' select'. Когда он доступен для чтения, вы можете позвонить, например. ['sys.stdin.read'] (http://docs.python.org/2/library/stdtypes.html#file.read), чтобы получить ввод. –

+0

Окок, но я хочу просто написать не читать (только для списка шоу) Я не хочу использовать recv() – Wiz

0

Ваш пост очень неясен, но я могу вам сказать, что проблема заключается в том, что вы не понимание того, как использовать select.

Код, который вы отправили только на звонки, выбирает один раз. Программа переходит к вызову select() и ждет, чтобы mainConnection был доступен для чтения (или для таймаута). Если mainConnection становится читаемым до истечения таймаута, select() возвращает с одним считываемым файловым дескриптором, который затем обрабатывается в цикле for. Но все. select никогда больше не вызывается, поэтому ваша программа никогда не проверяет наличие новых входящих соединений.

Практически во всех приложениях select должно быть в цикле. Каждый раз через цикл программа ждет в вызове select(), пока один или несколько сокетов не будут готовы для чтения или записи. Когда это произойдет, select дает вам дескрипторы файлов, которые готовы, и ваша работа заключается в том, что другой код действительно что-то делает. Например, если select возвращает дескриптор файла сокета как читаемый, то ваше задание вызывает .recv() на этом сокете.

Вы можете использовать asyncore. На самом деле, я думаю, вам следует изучить исходный код для asyncore, чтобы узнать, как правильно использовать select.

+0

Да, функция 'select' в Python знает, как обращаться сокет правильно. –

+0

Хорошо, удалил эту часть сообщения. Благодарю. – kjoppy

+0

О, я сожалею, что отступы в сообщении плохие. X) Я исправил, я забыл отступать мой код в редакторе stackoverflow (в IDLE python было хорошо) – Wiz