2013-08-06 8 views
6

Sto lavorando a un gioco multiplayer in python che utilizza la libreria socket per il suo networking. Il gioco supporterà il gioco su LAN. Un giocatore imposterà il server e gli altri giocatori della LAN potranno partecipare al gioco.Come rendere un server rilevabile ai client LAN

Per implementare questo, ho bisogno di un modo semplice per i giocatori di scoprire un elenco di server disponibili (non ci si deve aspettare che i giocatori debbano inserire gli indirizzi IP!). La mia soluzione preferita avrebbe usato solo la libreria dei socket Python (e facoltativamente altre parti della libreria standard).

Quello che sto cercando è client e server di codice:

  • cliente: trasmette la sua richiesta per i giochi per tutte le macchine in ascolto su una determinata porta sul

  • server (s) LAN: risponde al client con la sua disponibilità

rISPOSTA TENTATO Seguendo il consiglio di Hans' nella sua risposta qui sotto, un socket UDP può essere utilizzato per rispondere trasmettere le richieste f rom il cliente.

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) 

Cliente:

#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 

ci sono altri modi interessanti per gestire questo problema reperibilità?

+1

Si dovrebbe chiedere aiuto con codice non la strategia - probabilmente si potrebbe appendere intorno ad una chat room per ottenere questa domanda ha risposto – PyNEwbie

risposta

3

Si potrebbe provare una trasmissione UDP. Puoi ad es. invia una trasmissione dal client. Il server dovrebbe quindi trasmettere una risposta con il suo indirizzo in modo che il client possa utilizzare una connessione regolare.

vedi qui per un po 'di codice di esempio: http://wiki.python.org/moin/UdpCommunication

+0

Grazie per la risposta. Stai suggerendo di iterare su 192.168.0.x per x nel range (1.256) e provare una connessione UDP sulla porta specifica per ciascuno? L'esempio specifico del wiki presuppone che il server sia un host locale. – dlm

+0

Una trasmissione verrà inviata a ciascun indirizzo nel raggio, quindi non è necessario iterare. –

+0

Nell'esempio, è necessario che il server risponda al client. Questo può essere fatto invertendo la trasmissione (chiedi al server di inviare una trasmissione UDP di risposta. Fai in modo che il client apra un listener UDP e attenda la risposta) –