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