Wie man ein hintergrund Verfahren ständig überprüfen, während für die Eingangs - threading?

Habe ich kleine server und-client Python-Skripte, in denen der client sendet einen string, und der server antwortet mit der Rückseite. Wenn der Kunde einen quit-string, der client beendet und dann den server verlässt.

Ich möchte den server "erhalten, rückwärts senden" - Prozedur im hintergrund laufen, während das Programm ständig überprüfen, stdin für einen quit-string.

Ich habe versucht, mit threading aber wegen der Sperrung, dass viele socket-Aufrufe verursachen, es würde nicht richtig funktionieren.

Nur so können Sie sich eine Vorstellung von dem, was ich bereits getan habe.

server.py:

import socket
from time import sleep

sock = socket.socket()
sock.bind(("127.0.0.1",12346))
sock.listen(3)
print "Waiting on connection"
conn = sock.accept() 
print "Client connected"

while True:
    m = conn[0].recv(4096)
    if m == "exit":
        sleep(1)
        break
    else:
        conn[0].send(m[::-1])

sock.shutdown(socket.SHUT_RDWR)
sock.close()

client.py:

import socket

sock = socket.socket()
sock.connect(("127.0.0.1",12346))

while True:
    s = raw_input("message: ")
    sock.send(s)

    if s == "exit":
        print "Quitting"
        break

    print sock.recv(4096)

sock.shutdown(socket.SHUT_RDWR)
sock.close()
  • "erhalten, reverse, senden Sie" sieht aus wie die einer sehr kurzen Zeit, meiner Meinung nach, warum Sie möchten, um es im hintergrund laufen lassen?
  • Denn ich kann nicht sehen, eine Möglichkeit zu haben, "erhalten, reverse, senden" und "get user input", den gleichen Prozess, weil raw_input() blockiert, bis er eine Eingabe erhält, die unterbricht den Fluss der Pakete. Ich habe zwei Ideen, die ich nicht wollen, in die Tat umzusetzen: Geben Sie dem Klienten die Fähigkeit zu töten und die server, oder limit, wie lange raw_input() Blöcke für (timeout)
  • Ich verstehe es nicht. Also, was Sie wollen, ist zu kombinieren die zwei scripts "server.py" und "client.py" in einem einzigen Skript und führen Sie einfach, dass ein Skript? Oder wollen Sie einfach nur zu laufen "server.py" im hintergrund (in Unix ist es getan werden kann, mit python server.py &)?
  • Ich will, dass die server in der Lage sein zu senden und zu empfangen Pakete, während gleichzeitig die überprüfung der Benutzereingaben
  • Warum möchtest du das tun? Wenn es nur einen client, der client wartet auf den server zurück das Ergebnis sowieso und wird nicht senden Sie keine weiteren Eingaben zu server, richtig? Wahrscheinlich Sie wollen, dass der server in der Lage sein, um mehrere clients statt?
  • Sie wollen, dass der server beendet werden, wenn die person, auf die server-Konsole-Typen 'quit' auf stdin? Und diese ist getrennt von der 'exit' den client senden kann? Und Sie wollen, dass der server zum abrufen von Daten auf der Standardeingabe, statt der Sperrung in einem anderen thread?
  • Ja. In meinem ideal-design der client nicht in der Lage, senden Sie eine exit-signal an den server; die einzige Möglichkeit zum beenden der server ist von seinem eigenen terminal-Instanz. Während es bei der überprüfung stdin für das quit-signal, ich möchte in der Lage sein, um reibungslos in die Bearbeitung von client-verbindungen, Verbindungstrennungen und die Paketverarbeitung. Kommst du mich?
  • Ich denke so, aber ich habe noch zwei weitere klärende Fragen: haben Sie etwas auf stdin anderen als den quit-Befehl und muss es sein, stdin oder kann es ein signal, wie ^C mit einem anmutigen exit?
  • Letztendlich möchte ich mehrere server-seitigen Befehle andere als beendet, aber für jetzt, ich brauche keine.
  • Ich sehe, ich habe nicht bemerkt, dass von "stdin" es soll bedeuten, dass die "stdin" von dem server-terminal. Ich korrigiere meine Antwort.

Schreibe einen Kommentar