连接服务器时的copas循环问题

我是Lua编程的新手,正在尝试在openwrt上作为客户端实现Lua-websocket。这里是该库。 我尝试使用客户端copas库,但问题是脚本在执行一次后停止监听服务器(即连接到服务器,接收消息,发送消息)。我希望脚本始终监听服务器,而没有任何超时或脚本停止的情况。 以下是脚本

local copas = require'copas'
local websocket = require'websocket'
local json = require('json')
local client = require 'websocket.client'.new()

local ok,err = client:connect('ws://192.168.1.250:8080')
if not ok then
   print('无法连接',err)
end

local ap_mac = { command = 'subscribe', channel = 'test' }
local ok = client:send(json.encode(ap_mac))
if ok then
   print('已发送消息')
else
   print('连接已关闭')
end

local message,opcode = client:receive()
if message then
   print('消息',message,opcode)
else
   print('连接已关闭')
end

local replymessage = { command = 'message', message = 'TEST' }
local ok = client:send(json.encode(replymessage))
if ok then
   print('已发送消息')
else
   print('连接已关闭')
end

copas.loop()

这里的copas.loop()不起作用。

在openWrt上,我安装了Lua 5.1

点赞
用户162054
用户162054

简短回答:您没有正确使用Copas。

详细解释:copas.loop无法正常工作,因为您既没有创建Copas服务器,也没有创建Copas线程。请查看the Copas documentation

您的脚本中的sendreceive操作是在外部执行的,并不在Copas.addthread(function()... end)之内。还创建了一个不是copas而是同步的websocket客户端(默认值)。请查看lua-websocket documentation及其示例。

解决方案:

local copas     = require'copas'
local websocket = require'websocket'
local json      = require'cjson'

local function loop (client)
  while client.state == "OPEN" do
    local message, opcode = client:receive()
    ... -- 处理消息
    local replymessage = { command = 'message', message = 'TEST' }
    local ok, err = client:send(json.encode(replymessage))
    ... -- 检查ok, err
  end
end

local function init ()
  local client = websocket.client.copas ()
  local ok,err = client:connect('ws://192.168.1.250:8080')
  ... -- 检查ok, err
  local ap_mac = { command = 'subscribe', channel = 'test' }
  ok, err = client:send(json.encode(ap_mac))
  ... -- 检查ok, err
  copas.addthread (function ()
    loop (client)
  end)
end

copas.addthread (init)
copas.loop()

init函数实例化了一个Copas client。它还在Copas线程中启动了主loop,只要连接打开,就会等待传入的消息。

在启动Copas循环之前,请勿忘记为init函数添加一个Copas线程。

2017-03-22 10:55:02