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?
Dies ist nicht einfach. Sie müssen wahrscheinlich einen Thread erstellen, um auf Eingaben zu warten und eine Art Signal-/Ereignissystem zu haben. – Falmarri