2010-12-15 6 views
0

Ich versuche, die Befehle zu überprüfen, die ich von einem Client an einen Server senden möchte. Ich möchte Select verwenden, damit ich nichts blockiere, aber wenn ich unverhohlen nach input() frage, blockiere ich. Also, es scheint, ich sollte stattdessen sys.stdin.readline() verwenden. Doch dann gibt es eine Trennung zwischen den eingegebenen Befehlen und der Typprüfung ich tun möchte:wie zur Benutzereingabe ohne Blockierung in Python3 aufgefordert werden?

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() 

Grundsätzlich, wenn der Kunde nicht die empfangenen Daten als Befehl nicht erkennt, der Kunde geht davon aus ist es nur ein Chat Nachricht und schreibt es entsprechend auf stdout. Aber, wenn ich einen Befehl wie 'GO' bekomme, muss ich den Client zur Eingabeaufforderung (oder nur eine Nachricht zur Eingabe, so dass ich nicht blockieren mit input()) den Benutzer für die Eingabe von Befehlen, so dass ich den Befehl innerhalb der gleichen eingeben können Nest. Ist das ohne Gewinde möglich?

+0

Dies ist nicht einfach. Sie müssen wahrscheinlich einen Thread erstellen, um auf Eingaben zu warten und eine Art Signal-/Ereignissystem zu haben. – Falmarri

Antwort

1

Ich glaube nicht, dass es möglich ist, input() auf nicht blockierende Weise zu verwenden, ohne auf Threads zurückgreifen zu müssen.

Verwandte Themen