2013-08-06 59 views
6

我正在使用套接字库进行网络连接的python中的多人游戏。该游戏将支持LAN上播放。一名玩家将设置服务器,局域网上的其他玩家将能够加入游戏。为了实现这一点,我需要一个简单的方法让玩家发现可用服务器的列表(玩家不应该被期望输入IP地址!)。我的首选解决方案将只使用python套接字库(以及可选的标准库的其他部分)。如何使服务器可发现到局域网客户端

我所寻找的是客户端和服务器代码:

  • 客户:广播游戏的所有计算机监听局域网

  • 服务器(S)在某一端口上的要求:回复客户端的可用性

试图回答在下面的回答中,汉斯的建议,UDP套接字可用于响应广播请求f rom客户端。

服务器:

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

客户:

#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 

还有没有其他令人信服的方式来处理这个问题的曝光率?

+1

你应该寻求帮助的代码不是战略 - 你也许可以流连聊天室收到这样的问题回答 – PyNEwbie

回答

3

你可以尝试一个UDP广播。你可以例如从客户端发送广播。然后服务器应该广播一个响应及其地址,以便客户端可以使用常规连接。

看到这里的一些示例代码:http://wiki.python.org/moin/UdpCommunication

+0

感谢您的回答。你是否建议在192.168.0.x范围内迭代(范围1,256)x并在特定端口上尝试UDP连接?维基的具体例子假定服务器是本地主机。 – dlm

+0

广播将发送到范围内的每个地址,因此不需要迭代。 –

+0

在示例中,您需要让服务器响应客户端。这可以通过反转广播来完成(让服务器发送一个响应UDP广播,让客户端打开一个UDP监听器并等待响应) –

相关问题