2013-08-06 11 views
6

Pracuję nad grą dla wielu graczy w Pythonie, która używa biblioteki gniazd do tworzenia sieci. Gra będzie obsługiwać odtwarzanie przez sieć LAN. Jeden gracz skonfiguruje serwer, a inni gracze w sieci LAN będą mogli dołączyć do gry.Jak uczynić serwer wykrywalnym dla klientów LAN

Aby to wdrożyć, potrzebuję prostego sposobu, aby gracze odkryli listę dostępnych serwerów (gracze nie powinni oczekiwać, że będą musieli podawać adresy IP!). Moim preferowanym rozwiązaniem byłaby tylko biblioteka gniazd Pythona (i opcjonalnie inne części biblioteki standardowej).

Co szukam jest klient i serwer kod:

  • klient: rozgłasza swój wniosek do gier do wszystkich maszyn słuchania na określonym porcie w sieci LAN

  • serwera (ów): odpowiedzi do klienta z jego dostępności

PRÓBA oDPOWIEDŹ po poradę Hansa w poniższej jego odpowiedź, gniazdo UDP mogą być wykorzystywane do reagowania transmisję żąda f rom klienta.

Serwer:

#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) 

Klient:

#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 

Czy istnieją inne istotne sposoby obsługi wykrywalność tego problemu?

+1

Powinieneś być z prośbą o pomoc z kodem nie strategii - można prawdopodobnie obijać czacie, aby na to pytanie odpowiedział – PyNEwbie

Odpowiedz

3

Możesz wypróbować transmisję UDP. Możesz np. wyślij transmisję od klienta. Serwer powinien następnie nadać odpowiedź z jego adresem, aby klient mógł korzystać z regularnego połączenia.

Zobacz tutaj jakiś przykład kodu: http://wiki.python.org/moin/UdpCommunication

+0

Dzięki za odpowiedź. Sugerujesz iterowanie ponad 192.168.0.x dla x w zakresie (1,256) i próbowanie połączenia UDP na konkretnym porcie dla każdego? Konkretny przykład na wiki zakłada, że ​​serwer jest hostem lokalnym. – dlm

+0

Transmisja zostanie wysłana do każdego adresu w zakresie, więc nie ma potrzeby powtarzania. –

+0

W przykładzie należy wykonać odpowiedź serwera na klienta. Można to zrobić, cofając transmisję (Niech serwer wyśle ​​komunikat UDP rozgłoszeniowy, aby klient otworzył słuchacza UDP i poczekaj na odpowiedź) –

Powiązane problemy