2010-12-15 101 views
0

J'essaie de taper les commandes que je veux envoyer à un serveur à partir d'un client. Je veux utiliser select donc je ne bloque rien, mais si je demande ouvertement input(), je bloque. Donc, il semble que je devrais utiliser sys.stdin.readline() à la place. Cependant, alors il y a un décalage entre les commandes entrées et la vérification du type que je veux faire:comment demander une entrée utilisateur sans bloquer dans python3?

while not self.flag: 
    sock_read, sock_write, sock_except = \ 
     select.select([sys.stdin, self.client], [], []) 

    for sock in sock_read: 
     if sock == sys.stdin: 
      data = sys.stdin.readline().strip() 
      if data: 
       self.client.send(data.encode('utf_8')) 
     elif sock == self.client: 
      data = sock.recv(bufsize) 
      if data.decode('utf_8') is '': # server closed connection 
       print("Lost connection to server, shutting down...") 
       self.flag = True 
       break 
      else: # process data '\n' delimited 
       readbuf += data 
       while b'\n' in readbuf: 
        msg,readbuf = readbuf.split(b'\n', 1) # separate by \n 
        msg = msg.decode('utf_8') 
        msg.strip('\n') 
        # make below into a function 
        # got data from server 
        if msg == 'BEGIN': 
         self.playstarted = True 
        elif msg == 'GO': 
         #command = input("Your turn: ") 
         # typecheck command, something like 
         # while is_not_valid_command(): 
         # keep asking for input 
         print("You",command) 

         command += '\n' # delimiter 
         sock.send(command.encode('utf_8')) 
        else: 
         sys.stdout.write(msg + "\n") 
         sys.stdout.flush() 

Fondamentalement, si le client ne reconnaît pas les données reçues comme une commande, le client suppose qu'il est juste un chat en message et écrit à stdout en conséquence. Mais, quand j'obtiens une commande comme 'GO', j'ai besoin que le client invite (ou affiche juste un message demandant l'entrée ainsi je ne bloque pas avec input()) l'utilisateur pour l'entrée de commande ainsi je peux dactylographier la commande dans le même nid. Est-ce possible sans fils?

+0

Ce n'est pas facile. Vous devrez probablement créer un thread pour écouter les entrées et disposer d'un système de signal/événement. – Falmarri

Répondre

1

Je ne pense pas qu'il soit possible d'utiliser input() de manière non bloquante sans recourir à des threads.