如何使 LAN 客户端可以发现服务器

Posted

技术标签:

【中文标题】如何使 LAN 客户端可以发现服务器【英文标题】:How to make a server discoverable to LAN clients 【发布时间】:2013-08-07 10:54:47 【问题描述】:

我正在使用 Python 开发一个多人游戏,该游戏使用套接字库进行网络连接。游戏将支持局域网播放。一名玩家将设置服务器,局域网上的其他玩家将能够加入游戏。

为了实现这一点,我需要一种让玩家发现可用服务器列表的简单方法(不应该期望玩家必须输入 IP 地址!)。我首选的解决方案将仅使用 python 套接字库(以及可选的标准库的其他部分)。

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

客户端:将其对游戏的请求广播到所有在 LAN 上侦听某个端口的机器

服务器:回复客户端的可用性

尝试的答案 按照 Hans 在下面的答案中的建议,可以使用 UDP 套接字来响应来自客户端的广播请求。

服务器:

#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】:

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

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

【讨论】:

感谢您的回答。您是否建议为 x in range(1,256) 迭代 192.168.0.x 并在每个特定端口上尝试 UDP 连接? wiki 上的具体示例假定服务器是本地主机。 会向范围内的每个地址发送广播,因此无需迭代。 示例中,需要让服务器响应客户端。这可以通过反转广播来完成(让服务器发送响应 UDP 广播。让客户端打开一个 UDP 侦听器并等待响应)

以上是关于如何使 LAN 客户端可以发现服务器的主要内容,如果未能解决你的问题,请参考以下文章

IIS 页面可在 LAN 中远程访问,但不能在服务器本地访问

LAN 上的服务器/客户端应用程序 TimeoutError

带有 MySQL 客户端-服务器 LAN 设置的 Java Swing JDBC

docker-compose 连接来自 LAN 上不同设备的服务器/客户端容器

在 LAN 上运行 codeigniter 应用程序

在 LAN 中使用 Websockets 代替原始 TCP 套接字有啥好处吗?