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

标签 python networking game-development kivy

我正在使用 python 开发一款多人游戏,该游戏使用套接字库进行联网。该游戏将支持通过 LAN 进行游戏。一名玩家将设置服务器,局域网上的其他玩家将能够加入游戏。

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

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

  • 客户端:向局域网内某个端口上监听的所有机器广播它的游戏请求

  • server(s):回复客户端可用性

尝试回答 根据 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

是否有其他令人信服的方法来处理这个可发现性问题?

最佳答案

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

有关示例代码,请参见此处:http://wiki.python.org/moin/UdpCommunication

关于python - 如何使 LAN 客户端可以发现服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18080094/

相关文章:

java - UDP 绑定(bind)失败

docker - docker-compose.yml 端口上的引用有什么不同吗?

javascript - 使用 Pixi JS 为瓦片 map 创建等距投影瓦片?

c# - 如何加速无尽跑酷

python - 将变量与字典中的第二级进行匹配

python - OpenCV 检测具有多个边界框的单个符号

python - 使用样式表删除 matplotlib 图中的顶部和左侧轴

python - 将 24 位整数转换为 32 位整数的更多 Pythonic 方式

jsp - 无法从在 tomcat 6.0 上运行的 jsp 访问网络映射驱动器

Java 图形闪烁