Websocket 连接服务器时出现copas循环问题

Websocket 连接服务器时出现copas循环问题,websocket,lua,openwrt,Websocket,Lua,Openwrt,我是lua编程新手,并尝试在openwrt中作为客户端实现lua websocket。 正在尝试使用客户端copas库,但问题是脚本在执行一次(即连接到服务器、接收消息、发送消息)后停止侦听服务器。我希望脚本始终侦听服务器,而不出现任何超时或脚本暂停。 下面是脚本 local copas = require'copas' local websocket = require'websocket' local json = require('json') local client = require

我是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('could not connect',err)
end

local ap_mac = { command = 'subscribe', channel = 'test' }
local ok = client:send(json.encode(ap_mac))
if ok then
   print('msg sent')
else
   print('connection closed')
end

local message,opcode = client:receive()
if message then
   print('msg',message,opcode)
else
   print('connection closed')
end

local replymessage = { command = 'message', message = 'TEST' }
local ok = client:send(json.encode(replymessage))
if ok then
   print('msg sent')
else
   print('connection closed')
end

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

在openWrt上,我安装了Lua5.1。简短回答:您没有正确使用Copas

详细说明:
copas.loop
不执行任何操作,因为您既没有创建copas服务器,也没有创建copas线程。检查

脚本中的
send
receive
操作在Copas外部执行,因为它们不在
Copas.addthread(函数()…end)
内。您还创建了一个websocket客户端,它不是copas客户端,而是一个同步客户端(默认)。检查及其示例

解决方案:

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()
    ... -- handle message
    local replymessage = { command = 'message', message = 'TEST' }
    local ok, err = client:send(json.encode(replymessage))
    ... -- check ok, err
  end
end

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

copas.addthread (init)
copas.loop()
init
函数为Copas实例化一个
客户机。它还启动Copas线程中的主
循环
,只要连接打开,它就会等待传入消息


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

Hey@AlbanLinard感谢您的帮助。它确实在openwrt上对我起了作用,也通过了copas文档;我完全搞砸了:P谢谢你纠正我。