1

好的,最后我需要一些帮助......我正在尝试设置一个同时监听多个客户端的 lua 服务器。

我们正在使用 lua 编写一个 Android 游戏,这个游戏必须与我的服务器通信。我需要发送和接收来自玩家的数据并将其存储在 MySQL 数据库中。但我最大的问题是, luasocket 不能原生处理多个客户端,所以我尝试使用Copas

我正在使用本教程/手册对 Copas 进行测试:Copas Manual 但我的代码甚至不监听传入的连接......所以我插入了一些打印命令来查看我的代码挂起的位置。有人可以帮助我吗?

local socket  = require("socket")
local copas   = require("copas")
local server1 = assert(socket.bind("*", 2906))
local server2 = assert(socket.bind("*", 2907))
local server3 = assert(socket.bind("*", 2908))

--Register servers
copas.addserver(server1, echo1)
copas.addserver(server2, echo2)
copas.addserver(server3, echo3)

--Simple echo handler
function echo1(skt)
    print("1")
    reqdata = copas.receive(skt, pattern)
    copas.send(skt, respdata)
end

function echo2(skt)
    print("2")
    reqdata = copas.receive(skt, pattern)
    copas.send(skt, respdata)
end

function echo3(skt)
    print("3")
    reqdata = copas.receive(skt, pattern)
    copas.send(skt, respdata)
end

    print("4")
reading = {server}
    print("4.1")

while true do
    print("4.2")
input = socket.select(reading)
    print("4.3")
skt = input:accept()
    print("4.4")
newthread(echo1(skt))
    print("4.5")
end

print("5")
copas.loop()
print("6")
4

1 回答 1

0

您的脚本在4.2步骤中阻塞,因为您select以不正确的方式使用。select需要获取它检查的套接字表,因此您需要使用servers = {server1, server2, server3}该表并将其传递给select.

select然后返回一个表,其中包含您可以迭代的“可读”和“可写”状态的套接字列表。这些方面的东西:

local servers = {server1, server2, server3}
local canread, canwrite, error = socket.select(servers, nil, 1)
for _, input in ipairs(canread) do
  local client = input:accept()
  ...
end

有关详细信息,请参阅luasocket 发行版中的示例我对类似问题的回答。

于 2015-12-29T19:38:35.180 回答