2017-02-14 1 views
0

Ich versuche, ein Server- und Client-Chat-Skript zu ändern, das in Python implementiert wurde. Eine der Anforderungen ist, dass der Client beendet wird, wenn der Benutzer STRG-D eingibt. Meine Frage ist, wie lese ich, dass der Benutzer (Ctrl-D) eingegeben und es in diesem Code implementieren. Sollte ich einfach den Socket wie c_socket.close() ohne irgendeine Nachricht zurück zu dem Server schließen, den ich verlasse?Beenden der Clientverbindung zum Server über die Tastenkombination in Python

Danke!

# telnet program example 
import socket, select, string, sys 
import readline 
def prompt() : 
    sys.stdout.write('<You> ') 
    sys.stdout.flush() 

#main function 
if __name__ == "__main__": 

    if(len(sys.argv) < 3) : 
     print 'Usage : python MClient hostname port' 
     sys.exit() 

    host = sys.argv[1] 
    port = int(sys.argv[2]) 

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    s.settimeout(2) 

    # connect to remote host 
    try : 
     s.connect((host, port)) 
    except : 
     print 'Unable to connect' 
     sys.exit() 

    print 'Connected to remote host. Start sending messages' 
    prompt() 

    while 1: 
     socket_list = [sys.stdin, s] 

     # Get the list sockets which are readable 
     read_sockets, write_sockets, error_sockets = select.select(socket_list , [], []) 

     for sock in read_sockets: 
      #incoming message from remote server 
      if sock == s: 
       data = sock.recv(4096) 
       if not data : 
        print '\nDisconnected from chat server' 
        sys.exit() 
       else : 
        #print data 
        sys.stdout.write(data) 
        prompt() 

      #user entered a message 
      else : 
       msg = sys.stdin.readline() 
       s.send(msg) 
       prompt() 

Antwort

1

Letzte Sache zuerst - ob Sie etwas an den Server vor dem Schließen des Sockets senden müssen oder nicht hängt nur von Ihrem Protokoll ab. Angesichts der Einfachheit des vorgestellten Client-Codes würde ich annehmen, dass das Schließen des Sockets ausreichen sollte (und der Server sollte sowieso unangekündigte Unterbrechungen behandeln, da Netzwerk-I/O nicht als persistent betrachtet werden sollte).

Zweitens CTRL + D bewirkt, dass die zurück Nachricht von sys.stdin.readline() als leer zurück, so dass Sie gegen das testen können, zB:

msg = sys.stdin.readline() 
if msg: 
    s.send(msg) 
    prompt() 
else: 
    s.close() 
    sys.exit() 

Wenn Sie wirklich etwas an den Server senden müssen (wieder , hängt vom Protokoll ab) Sie können die Methode shutdown() von socket verwenden, bevor Sie close() aufrufen.

Beachten Sie jedoch, dass der hier vorgestellte Code nicht berücksichtigt, die STRG + D während des Lesens aus dem Socket drücken (dh Daten empfangen), wenn Sie einen besonders langen Datenstrom kommen in Ihrem STRG + D gewonnen nicht registriert sein. Sie können dies lösen, indem Sie die Benutzereingabe während des Abrufvorgangs überprüfen (und in den Puffer schreiben, um sie später zu senden), oder Sie können Ihren Empfangscode einfach in einem separaten Thread ablegen und den Hauptthread nur für Benutzereingaben belassen.

Sie können dann mit dem atexit Modul sauber Ausgang von Ihrem Client zu jeder Zeit.

+0

Danke !! arbeitete genau so, wie ich es wollte. –

Verwandte Themen