Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lua 从服务器接收数据时出错_Lua_Coronasdk - Fatal编程技术网

Lua 从服务器接收数据时出错

Lua 从服务器接收数据时出错,lua,coronasdk,Lua,Coronasdk,我想让下面的测试函数打印出消息“k不是nil”,但我的代码不起作用。它已经从我的服务器收到了k值,但是如果k~=nil,它就不会检查行。下面是我的代码。谢谢你的建议 local function receiveData( ) local l,e = client:receive() if l~=nil then print(l) return l,e else timer.performWithDelay(100,rece

我想让下面的测试函数打印出消息“k不是nil”,但我的代码不起作用。它已经从我的服务器收到了k值,但是如果k~=nil,它就不会检查行。下面是我的代码。谢谢你的建议

local function receiveData(  )
    local l,e = client:receive()
    if l~=nil then
        print(l)
        return l,e
    else
        timer.performWithDelay(100,receiveData)
    end
end

function test( )
    k = receiveData()
    if k ~=nil then
        print("k isn't nil")
    end
end

test()

你确定你收到了数据吗?您的程序在控制台中打印什么

你可以考虑以下修改<

local function receiveData(  )
  local l,e = client:receive()
  if l~=nil then
    print(l)
    return l,e
  else
    timer.performWithDelay(100,function() l, e = receiveData() end)
  end
  return l, e
end

所以我猜想,当第二次调用receiveData时,您的返回值(l,e)将被丢弃(因为performWithDelay与它们无关)。

问题是,如果第一次尝试时未收到数据,则k为零,测试返回。在收到数据之前,
receiveData
将以100毫秒的间隔再次调用,但返回将被performWithDelay丢弃,然后
test
已返回(请参阅此答案的第一句话)

解决方案是设置一个回调,当数据最终到达时,
receiveData
可以调用该回调。然后回调可以处理数据。将
返回l,e
替换为
onReceiveData(l,e)
,并让其在
循环中执行测试等待的操作。当然,
receiveData
可以直接设置这个标志,让测试监视,但一旦你的应用程序变大,最好将接收和处理分开

function receiveData() 
...
-- then:

local data = nil

function onReceiveData(l,e)
    data = l
    print('ready to process data', data, e)
end

funtion test() 
    receiveData() 
    while data == nil do sleep(100) end 
    print('data received and processed') 
end

test()
其中
sleep(100)
是您可以想到的,因为在Lua甚至Corona中都没有内置函数来实现这一点(尽管Corona有
system.getTimer()
,它在应用程序启动后返回ms,所以您可以

function sleep(ms) 
    local start = system.getTimer() 
    while system.getTimer() - start < ms do 
    end
end
功能睡眠(毫秒)
local start=system.getTimer()
而system.getTimer()-start

我不太喜欢空while循环,但在一个测试实用程序函数中它是可以的。如果您使用的是套接字库,它有一个睡眠功能——请查看以获取其他选项)。

Hi vetham,我确信收到了数据,因为它打印了我正确发送的值,但不知道为什么它没有在测试()中打印函数。你试过我的修改吗?嗨,维瑟姆,我试过在我的测试函数中编写新函数,方法是让k=client:receive()可以工作。我也不明白为什么上面的代码不起作用。如果您认为答案应该改进以获得投票权,请发表评论,谢谢!