2013-08-06 14 views
6

Ich arbeite an einem Multiplayer-Spiel in Python, das die Socket-Bibliothek für seine Vernetzung verwendet. Das Spiel unterstützt das Spielen über LAN. Ein Spieler wird den Server einrichten und andere Spieler im LAN können dem Spiel beitreten.Wie man einen Server für LAN-Clients erkennbar macht

Um dies zu implementieren, brauche ich eine einfache Möglichkeit für die Spieler, eine Liste der verfügbaren Server zu finden (Spieler sollten nicht erwartet werden, IP-Adressen eingeben zu müssen!). Meine bevorzugte Lösung würde nur die Python-Socket-Bibliothek (und optional andere Teile der Standard-Bibliothek) verwenden.

Was ich suche ist Client- und Server-Code:

  • Client: sendet seine Anfrage für Spiele für alle Maschinen auf einem bestimmten Port auf dem LAN hören

  • Server (n): antwortet dem Client mit seiner Verfügbarkeit

VERSUCHTEN ANTWORT nach Hans Rat in seiner Antwort unten, kann ein UDP-Socket-Broadcast reagieren verwendet werden, fordert f vom Kunden.

Server:

#UDP server responds to broadcast packets 
#you can have more than one instance of these running 
import socket 
address = ('', 54545) 
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1) 
server_socket.bind(address) 

while True: 
    print "Listening" 
    recv_data, addr = server_socket.recvfrom(2048) 
    print addr,':',recv_data 
    server_socket.sendto("*"+recv_data, addr) 

Auftraggeber:

#UDP client broadcasts to server(s) 
import socket 

address = ('<broadcast>', 54545) 
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
client_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) 

data = "Request" 
client_socket.sendto(data, address) 
while True: 
    recv_data, addr = client_socket.recvfrom(2048) 
    print addr,recv_data 

Gibt es andere Möglichkeiten, dieses zwingende Auffindbarkeit Problem zu umgehen?

+1

Sie sollten um Hilfe mit dem Code nicht Strategie zu fragen - Sie könnten wahrscheinlich um einen Chat-Raum hängen diese Frage beantwortet – PyNEwbie

Antwort

3

Sie könnten eine UDP-Übertragung versuchen. Sie können z.B. Senden Sie eine Übertragung vom Client. Der Server sollte dann eine Antwort mit seiner Adresse senden, damit der Client eine normale Verbindung verwenden kann.

hier einige Beispiel-Code Siehe: http://wiki.python.org/moin/UdpCommunication

+0

Danke für die Antwort zu bekommen. Würden Sie vorschlagen, über 192.168.0.x für x im Bereich (1.256) zu iterieren und pro Port eine UDP-Verbindung für den jeweiligen Port auszuprobieren? Das spezielle Beispiel im Wiki geht davon aus, dass der Server ein lokaler Host ist. – dlm

+0

Eine Broadcast-Nachricht wird an jede Adresse im Bereich gesendet, sodass keine Iteration erforderlich ist. –

+0

Im Beispiel müssen Sie den Server auf den Client reagieren lassen. Dies kann durch Umkehren der Übertragung erfolgen (Lassen Sie den Server eine UDP-Broadcast-Antwort senden. Veranlassen Sie, dass der Client einen UDP-Listener öffnet und auf die Antwort wartet). –