LuaSocket 在 Ruby 中无法从 UDPSocket 接收消息

我试图连接一个使用 Lua 的 Windows 计算机游戏和在我的 Macbook 上托管的用 Ruby 编写的外部服务器,两者都在同一个网络上。

这是在游戏开始时执行的 Lua 代码

socket = require("socket")
udp = socket.udp()
udp:setpeername('192.168.0.17', 9100) -- 这是我的笔记本电脑
udp:settimeout(0.001)

这是每个模拟步骤中执行的 Lua 代码:

udp:send("Simulation step")

message = udp:receive()

print(message)

这是 Ruby 服务器:

i = 0

Socket.udp_server_loop(9100) {|msg, msg_src|
  puts i.to_s + ": " + msg + " | " + msg_src.inspect.to_s
  i += 1
  msg_src.reply i.to_s + ": reply from server"
}

到目前为止还不错,游戏可以正确地接收到“来自服务器的回复”,并将其打印出来。 我可以在笔记本电脑上的 Ruby 控制台中看到:

19: Simulation step | #<Socket::UDPSource: 192.168.0.80:55697 to 192.168.0.17:9100>

但我希望做得更加异步 - 我想连续接收数据,并且只在必要时发送回一些东西。 我发现使用 UDP,我不必担心连接 - 只需发送消息即可通过。

我在 Ruby 中尝试了这个:

require 'socket'

s = UDPSocket.new

while 1 do
  s.send "hi", 0, "192.168.0.80", 9100
end

这不被 Luasocket 接收。 将超时时间增加到 1 秒钟也没有帮助。 将端口更改为 Windows 用于发送 UDP 数据包的端口(55697)也没有起作用。

这两台计算机上的防火墙都已禁用。

当我有东西要发送时,仅发送 msg_src.reply 不可行,它通常会花费一些时间计算,它将不能按时回复(超时前 0.001 秒)。

如何使用 UDP 实现这一点?或者也许不可能,我应该尝试使用 TCP?

点赞