TCP-Server mit mehreren Clienten

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Benutzeravatar
Kolazomai
User
Beiträge: 33
Registriert: Donnerstag 16. Februar 2006, 15:05
Kontaktdaten:

Hallo zusammen,

ich stehe vor einem Problem:
Ich bin gerade dabei, einen (einfachen) Server zu programmieren. Ich bin jetzt schon so weit, dass der Server die Verbindung anzeigt und auch Nachrichten empfangen kann, selber etwas von sich gibt, u.s.w.

Meine Frage lautet jetzt:
Wie schaffe ich es, dass 2 oder mehrere Clienten connecten können ?

Hier ein Teil des Codes:

Code: Alles auswählen

server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server_socket.bind(("",1337))
server_socket.listen(5)
print "Server started: Waiting for client on Port",port
f.write('Server started succesfully on Port',port)
def server_start():
    while 1:
        global client_socket
        global address
        client_socket, address = server_socket.accept()
        print address,"connected!"
        global running
        running = True
        while 1:
            if running == True:
                data = client_socket.recv(10000)
                f.write(str(address)+": "+str(data)+"\n")
                print "Incoming Message:"
                print str(address)+": "+str(data)
                main(data) # All starts here
            else:
                break
1.) Können alle Clienten über denselben Port mit dem Server kommunizieren ?

2.) Muss ich einen neuen Socket aufmachen, um eine neue Verbindung zu empfangen oder geht das auch mit dem alten ?

3.) Oder kann ich irgendwie server_socket.accept() im Hintergrund laufen lassen ?

4.) Oder gibt es einen Speziellen Befehl für mehrere Clients ?

Danke für jede Hilfe,

Mfg,

Kolazomai
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Wenn Du accept() auf den Server-Socket aufrufst wird eine Verbindung mit einem Client zurückgeliefert. Das kannst Du beliebig oft machen, jedes mal blockiert entweder der Aufruf (wenn kein Client sich verbinden will) oder aber ein neuer Client wird zurückgeliefert. Wichtig hierbei ist auch die Zahl die Du im Normalfall beim listen()-Aufruf mitgibst, diese bestimmt wieviele Clients sich zur selben Zeit in der Queue befinden dürfen (aus der Du mit accept() rausschöpfst) bevor der Server den Port "dichtmacht," sprich keine neue Verbindung mehr annimmt.

Wenn Du mehrere Clients hast hast Du zwei prinzipielle Möglichkeiten um diese zu bearbeiten:

1) mittels select (oder einem asynchronen Framework wie asyncore, twisted, medusa, u.Ä.) die einzelnen sockets interleaven, sprich jeden Socket für einen sehr kurzen Zeitbereich bearbeiten (also Daten empfangen, verarbeiten, senden), und dann mit dem nächsten weitermachen. Das ganze nennt sich dann ein Reaktor.

2) Für jeden Client einen eigenen Thread aufmachen in dem Du dann auch blockieren kannst, genau wie es Dein Server jetzt macht. Das ganze geht natürlich auch wenn Du einen neuen Prozess startest um die Daten vom Socket zu empfangen und zu schicken.

Ersteres ist für den Anfang schwieriger, aber meißtens performanter. Letzteres bietet Dir SocketServer+Mixin in der stdlib frei Haus. Ich würde damit anfangen die Dokumentation zu SocketServer zu lesen, dann die zu ThreadingTCPServer, und dann das Ding neu zu implementieren
--- Heiko.
Benutzeravatar
Kolazomai
User
Beiträge: 33
Registriert: Donnerstag 16. Februar 2006, 15:05
Kontaktdaten:

Ok,

Vielen Danke, modelnine;

Ich glaub ,ich werd erstmal Punkt 2.) "in Angriff" nehmen. Wenn dann noch fragen sind, meld ich mich einfach :P

Mfg,

Kolazomai
Benutzeravatar
Kolazomai
User
Beiträge: 33
Registriert: Donnerstag 16. Februar 2006, 15:05
Kontaktdaten:

Ok,

hab mich heut damit beschäftigt und hat sogar geklappt. Jetzt funktioniert alles.

Die Wendung haben SocketServer und ThreadingTCPServer gebracht.

Danke nochmals für die Hilfe,

Mfg,

Kolazomai
Antworten