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?
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