Ich möchte 3 SocketServer in einem Python-Programm erstellen:

import threading
import SimpleHTTPServer
import SocketServer

class PolicyHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        self.data = self.request.recv(128).strip()
        print self.data
        if self.data == '<policy-file-request/>\0':
            self.request.sendall('message 1')


class LiveRequestHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        self.request.sendall('message 2')


def main():
    httpd = SocketServer.TCPServer(('',80),\
                               SimpleHTTPServer.SimpleHTTPRequestHandler)
    httpdThr = threading.Thread(target=httpd.serve_forever)
    httpdThr.daemon = True
    httpdThr.start()

    liveServer = SocketServer.TCPServer(('',8090), LiveRequestHandler)
    livThr = threading.Thread(target=liveServer.serve_forever)
    livThr.daemon = True
    livThr.start()

    policyServer = SocketServer.TCPServer(('',834), PolicyHandler)
    policyThr = threading.Thread(target=policyServer.serve_forever)
    policyThr.daemon = True
    policyThr.start()

if __name__ == '__main__':
    main()

Ich führe es aus, die Ausgabe unten:

Finding files... done.
Importing test modules ... done.

----------------------------------------------------------------------
Ran 0 tests in 0.000s

OK

Es ist seltsam, dass das Programm sofort beendet wird, sodass mein Client-Programm keine Verbindung zum Drei-Socket-Server herstellen konnte. Wie kann verhindert werden, dass das Programm beendet wird?

0
Last Chance 6 Okt. 2012 im 11:49

3 Antworten

Beste Antwort

Daemon-Threads werden beendet, wenn keine Nicht-Daemon-Threads mehr ausgeführt werden. Sie werden daher beendet, wenn main endet. Fügen Sie etwas hinzu, um die Hauptleitung am Laufen zu halten, wie:

raw_input('Press enter to stop servers.')
0
Mark Tolonen 6 Okt. 2012 im 16:58

Wenn Sie die drei Server wirklich mit demselben Programm starten möchten, ist dies eine Lösung.

0
Hans Then 6 Okt. 2012 im 07:55

Jetzt ändere ich meinen Code wie folgt:

httpd = SocketServer.TCPServer(('',80), SimpleHTTPServer.SimpleHTTPRequestHandler)
httpdThr = threading.Thread(target=httpd.serve_forever)
httpdThr.daemon = True
httpdThr.start()

liveServer = SocketServer.TCPServer(('',8090), LiveRequestHandler)
livThr = threading.Thread(target=liveServer.serve_forever)
livThr.daemon = True
livThr.start()

policyServer = SocketServer.TCPServer(('',834), PolicyHandler)
policyThr = threading.Thread(target=policyServer.serve_forever)
policyThr.daemon = True
policyThr.start()

Es funktioniert gut. Aber jetzt weiß ich nicht, wie ich bei Bedarf eine Nachricht an den Client senden soll.

0
Last Chance 6 Okt. 2012 im 13:11