【问题标题】:Multiclient Copas server using Lua使用 Lua 的多客户端 Copas 服务器
【发布时间】:2015-12-29 14:13:19
【问题描述】:

好的,最后我需要一些帮助... 我正在尝试设置一个同时监听多个客户端的 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")

【问题讨论】:

  • “所以我已经插入了一些打印命令来查看我的代码挂在哪里”......和?它挂在哪里?究竟会发生什么?
  • 当您调用 addServer 时,尚未定义处理程序。
  • @EtanReisner 哦,对不起......它挂在“4.2”我打印“4”、“4.1”和“4.2”......然后它永远挂起
  • @moteus 好的,但我认为我的小回显函数就是那些处理程序。我应该如何正确定义这些处理程序?谢谢!
  • @moteus 的观点是,当copas.addserver(server1, echo1) 行运行时,echo1 变量中没有值。因此,您实际上是在调用copas.addserver(server1, nil)copas.addserver(server1),这显然没有达到您想要的效果。你需要先定义你的函数。

标签: mysql lua server copas


【解决方案1】:

您的脚本在4.2 步骤上阻塞,因为您以不正确的方式使用selectselect 需要获取它检查的套接字表,因此您需要使用 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

详情请参阅the example from luasocket distributionmy answer to a similar question

【讨论】:

    猜你喜欢
    • 2015-05-21
    • 1970-01-01
    • 2012-11-20
    • 2021-05-13
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-04
    相关资源
    最近更新 更多