2016-03-21 14 views
0

Ich habe eine client.py und eine server.py. Der Client empfängt gelegentlich Nachrichten vom Server. Der Client kann auch Nachrichten an den Server senden.Drucken zur Konsole und raw_input zur gleichen Zeit

Da raw_input den Hauptthread zu blockieren scheint, kann der Client, wenn er vom Server eine Nachricht erhält, nicht auf die Konsole drucken und benötigt raw_input, um als Erster fertig zu sein.

Ich habe versucht, Multithreading zu verwenden, um dies zu umgehen, aber im folgenden Code wird der Raw_input nicht einmal aufgerufen. Folgendes ist client.py

import socket 
import sys 
import threading 

BUFFER_SIZE = 1024 

def listen_for_server_response(s): 
    while 1: 
     data = s.recv(BUFFER_SIZE) 
     print(data) 

def main(): 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    s.connect((sys.argv[1], int(sys.argv[2]))) 
    thread = threading.Thread(target = listen_for_server_response(s)) 
    thread.start() 
    while 1: 
     command = raw_input("Command: ") 
     s.send(command) 

if __name__ == "__main__": 
    main() 

Jede Hilfe zu diesem wird sehr geschätzt!

Antwort

2

dies scheint wie schlechtes Design, aber Sie müssen Einfädeln mit einer aufrufbare Funktion

thread = threading.Thread(target = listen_for_server_response,args=(s,)) 
thread.start() 

durch Aufruf wie Sie im Beispiel zu tun nennen Sie es, bevor der Thread startet und nur Looping immer anrufen ... Sie machen es nicht einmal zu thread.start

+0

Wenn Sie denken, dass es schlecht entworfen ist, bin ich glücklich, einen anderen Weg zu versuchen. Was schlagen Sie vor? – cph2117

+0

Sie sollten wahrscheinlich Verwünschungen (wenn Sie auf einem Terminal bestehen) oder verwenden Sie eine ordnungsgemäße gui ... –

+1

+1, aber ich würde gegen den "schlechten Design" -Teil argumentieren. Wenn Ihr Ziel ist, nur auf dem Bildschirm zu echo dies ist in Ordnung (IMHO). – tdelaney

Verwandte Themen