2013-08-06 24 views
6

LAN müşterilerine keşfedilebilir bir sunucu nasıl yapılır. Oyun LAN üzerinden oynayacaktır. Bir oyuncu sunucuyu kuracak ve LAN'daki diğer oyuncular oyuna katılabilecek. Ben onun ağ için soket kütüphanesi kullanan Python çok oyunculu oyun üzerinde çalışıyorum

Bunu uygulamak için

, oyuncuların mevcut sunucularının listesini keşfetmek için basit bir yola ihtiyaç (oyuncular IP adreslerini girmek zorunda beklenen olmamalıdır!). Tercih ettiğim çözüm sadece python soket kitaplığını (ve isteğe bağlı olarak standart kitaplığın diğer bölümlerini) kullanırdı.

  • istemci:

    Ne arıyorum istemci ve sunucu kodu LAN

  • sunucu (lar) üzerinde belli bir bağlantı noktasında dinleme tüm makinelere oyunlar için kendi isteği yayınlar: onun durumu ile müşteriye cevap

    aşağıda onun cevabını Hans'ın tavsiyelerine uyarak girişimde bulundukları YANIT, UDP soket yayını cevap kullanılabilir

f istekleri müşteriye rom.

Sunucu:

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

Müşteri:

#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 

bu keşfedilebilirlik sorunu işlemek üzere diğer zorlayıcı yolları var mı?

+1

- muhtemelen bu soru cevap – PyNEwbie

cevap

3

Bir UDP yayını deneyebilirsin. Ör. İstemciden yayın gönder. Sunucu, daha sonra, müşterinin düzenli bir bağlantı kullanabilmesi için adresi ile bir yanıt yayınlamalıdır.

bazı örnek kodu için buraya bakınız: Kodun değil strateji ile yardım isteyen gerektiğini http://wiki.python.org/moin/UdpCommunication

+0

Teşekkür yanıtlanması için sohbet odası etrafında kalabilirim. Eğer aralık (1256) 'de x için 192.168.0.x üzerinde iterating düşündüren ve her biri için belirli bağlantı noktasında bir UDP bağlantı çalışıyorsun? Wiki'deki özel örnek, sunucunun yerel ana bilgisayar olduğunu varsayar. – dlm

+0

Menzil içindeki her adrese bir yayın gönderilecektir, bu nedenle yinelemeye gerek yoktur. –

+0

Örnekte, sunucuyu istemciye yanıtlamanız gerekir. Bu yayını tersine yapılabilir (sunucu bir yanıt UDP yayını göndersinler. Istemci UDP dinleyici açıp yanıt bekleyin olun) –