2016-03-20 6 views
0

Hier ist der Server:Wie könnte ich diesen "Step-basierten" Python-Chat-Server und -Client verbessern, sodass er mehr als zwei Instanzen unterstützt?

import socket 


HOST = '127.0.0.1' 
PORT = 4444 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((HOST, PORT)) 
s.listen(5) 

conn, addr = s.accept() 
print addr, 'connected.' 

while True: 
    data = conn.recv(1024) 
    print '> ', data 
    reply = raw_input(">> ") 
    conn.sendall(reply) 
    if reply == 'bye': 
     break 

conn.close() 

Und hier ist der Kunde:

import socket 

HOST = '127.0.0.1' 
PORT = 4444 


s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect((HOST, PORT)) 
while True: 
    message = raw_input("> ") 
    s.send(message) 
    reply = s.recv(1024) 
    print ">> ", repr(reply) 
    if message == 'bye': 
     break 

s.close() 

Was die effizienteste Weg ist, diesen Code zu aktualisieren mehrere Instanzen, und was noch wichtiger zu unterstützen: wie konnte ich zuweisen Namen (Nicknames) für alle Clients und machen sie so, dass Clients tippen können, wann immer sie wollen? Ich habe versucht, Threading zu verwenden, aber das war eine riesige Katastrophe.

Antwort

0

Multiple Client

Für mehrere Client-Verbindung, müssen Sie einige nicht-lineare Ausführung haben. Sie können entweder Korutinen oder Threads verwenden, um dies zu erreichen.

Python 3 kommt mit asyncio, Bibliothek, Koroutinen (und vielen anderen Funktionen) zu emulieren Multithreading nutzt. Ich schlage vor, Sie schauen sich das an.

Sie können auch Threads verwenden, es ist nicht so kompliziert. Immer wenn ein Client eine Verbindung zu Ihrem Server herstellt, müssen Sie nur einen neuen Thread erstellen, um Ihre Funktion auszuführen. Python official documentation sollte Ihnen helfen, das zu erreichen.

Nickname

Immer wenn ein Client auf dem Server verbindet, können Sie ein Benutzerobjekt in dem neu erstellten Thread mit Ihren Kundeninformationen, instanziiert, so dass jeder Thread seine eigenen Benutzer Instanz hat.