2015-06-19 3 views
0

В настоящее время я создаю клиент python для проекта. Я знаю мелочи о python. Извините, если мой код невелик! Мой клиент отлично работает, он подключается к серверу и «разговаривает» с ним, с легкостью. Но я хочу использовать выбор, как я в C. Так теперь мой клиент выглядит следующим образом:Использование select() в клиенте python

p = GetOptions() 
mess = MessageClass() 
ic = InterpretClass() 
cc = CommandClass() 
s = None 

def send_name_to_server(s): 
    var = 'TEAM ' 
    var += p.getName() 
    #var += '\r\n'                                              
    mess.sendMessage(s, var) 

def protocol(s): 
    rec = mess.readMessage(s) 
    if (ic.interpret_bienvenue(s, rec, p) == 1): 
    send_name_to_server(s) 
    rec = mess.readMessage(s) 
    ic.interpret_num_client(s, rec, p) 
    rec = mess.readMessage(s) 
    ic.interpret_size(s, rec, p) 
    var = 'OK' 
    mess.sendMessage(s, var) 

def main(): 
    try: 
    p.parseOpt() 
    if not p.getName(): 
     print('Exception : You need a name to start') 
     sys.exit() 
    mc = ModuleConnect() 
    s = mc.connect(p.getHost(), p.getPort()) 
    protocol(s) 
    s.close() 
    except ConnectionRefusedError: 
    print('Exception : The server has refused the connection') 
    except getopt.GetoptError: 
    print('Usage : client.py -n [NAME] -h [HOST] -p [PORT]') 
    except:                                               
    print('Exception : An error has occured')                                      

if __name__ == "__main__": 
    main() 

И мой класс ModuleConnect выглядит следующим образом:

импорт гнездо

class ModuleConnect(object): 

    """ Create connexion """ 

    def connect(self, host, port): 
    s = socket.socket() 
    s.connect((host, int(port))) 
    return s 

Итак, как это работает? Я разбираю аргументы, полученные мной из командной строки с помощью метода parseOpt (здесь не важно), затем я запускаю свое соединение с методом connect из ModuleConnect, а затем я разговариваю с моим сервером с помощью метода протокола. Просто я думаю? В C для того, чтобы использовать выбор я бы сделать что-то вроде этого:

FD_SET(0, &(c->read_fds)); 
FD_SET(c->sd, &(c->read_fds)); 
    if (select(c->sd + 1, &(c->read_fds), NULL, NULL, NULL) == -1)                                  
{ 
    perror("Client-select() error ! "); 
    exit(1); 
} 
if (FD_ISSET(c->sd, &(c->read_fds))) 
    read_message_from_server(c); 
if (FD_ISSET(0, &(c->read_fds))) 
    send_message(c); 

Если мой сервер говорит со мной первым, я прочитал, что он сказал мне, если я не послать сообщение я получил, чтобы отправить его. Но я не могу найти способ сделать это в python.

Снова извините, я полный ноб с питоном, и даже после учебника я не могу найти способ.

Благодарим за помощь!

+0

Разве вы не используете библиотеку SocketServer? – EvertW

+0

В этой библиотеке нет выбора, как это может мне помочь? –

ответ

0

Чтобы избежать проблемы, я продолжал читать и отправлять (почти) одновременно, и когда я читал что-то, что я не мог бы просто выбросить. Поэтому не нужно использовать select и juste read/write.

Смежные вопросы