Многоклиентный сервер Copas с использованием Lua

Хорошо, наконец, мне нужна помощь... Я пытаюсь настроить сервер lua, который одновременно прослушивает несколько клиентов.

Мы программируем игру для Android с использованием lua, и эта игра должна взаимодействовать с моим сервером. Мне нужно отправлять и получать данные от игроков и хранить их в базе данных 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")

1 ответ

Ваш скрипт блокируется на 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 и мой ответ на аналогичный вопрос для деталей.

Другие вопросы по тегам