- 参见:lipp/lua-websockets: Websockets for Lua. (github.com)
github网址可能需手动转换lipp.github.com/lua-websockets/>github.com/lipp/lua-websockets - websockets为底层的类似于TCP、UDP的socket(实现上基于更底层的socket),不同于上层的webserver
使用约定的ws协议,区分于http协议(请求)。 - 服务端(Service)需并行地支持多连接(实现方式见如下客户端中提及的并行方式);
客户端可同步(synchronous)(串行),或,基于Copas的协程或基于lua-ev(libev)的异步之并行。
并行方式中,libev较Copas对外的依赖重。
两者使用不同,如ws:on_message与ws:receive(节点精灵中是基于线程,进而使用onMessage) - 当前环境中存在的(现成的)应用:luaplus\Src\Modules\lua-websockets;luaplus\Src\Modules\copas\copas;ZeroBraneStudio\lualibs\copas
C:\Users\RobertLin\luaplus\Src\Modules\bitop - 客户端使用websocket URL(ws_url,如ws://localhost:80)连接服务端。
- 参见lua-websockets\API.md
分客户端:
- 建立websocket.client.sync(websocket.client.new)、websocket.client.copas
- 连接client:connect(ws_url,[protocol])、client:close([code],[reason])
- 访问client:receive()、client:send(message,[type])
服务端: - 配置config.port、interface(网络设备)、protocols(像是两头约定的方法)
- 建立websocket.server.copas.listen(config)
- 连接server:close
- 有个Protocol Handlers,客户连接时触发(调用)(对照以下节点精灵中的server:onOpen)
有默认协议/未声明协议响应入口。
- C连接时(client:connect)可不指定/指定默认协议,同时S有默认响应(default),故,protocol貌似非必须。
进而节点精灵可能能与lua-websockets通讯。 - 参考:websocket - How to open a web socket with Lua scripting language? - Stack Overflow,含(较API)串起来的例子——(对应上面的API.md)建立-连接-发送-接收-关闭。
- 参考:WebSocket | 节点精灵官网|安卓免Root小程序 (nspirit.cn)
s=webSocketServer(端口)
s:onStart/onOpen/onMessage/startc=webSocketClient("ws://ip:port")
c:onOpen(相当于onStart、onConnect?)/onError/onMessage/connect - 尝试构建lua-websocket
估计未使用到luabitop(lua bitop),故未尝试修复安装它。
使用时会报错..见下xor_mask
可以使用luarocks install lua-websockets --deps-mode=none跳过依赖的安装
尝试手动luarocks install copas,成功安装。
直接使用git\source\websocket.lua及websocket文件夹
重安装/更新lua-websockts至v2.2-1,于c:\programfiles\zerobranestudio\ - 有WebSocket 在线测试(websocket在线测试 (websocket-test.com))。
若ip或端口不正确,在等待服务器Websocket握手包...后会立刻返回和服务器断开连接!
- 经测试,可以打开本地服务器(localhost)(如,example\echo-server-copas.lua中对应ws://localhost:8080)
但尝试从调试器中发送数据时,(websocket的相关模块xor_mask)会报错。
- 经测试,可以打开本地服务器(localhost)(如,example\echo-server-copas.lua中对应ws://localhost:8080)
- 节点精灵,通过子线程同时运行服务端、客户端,工作正常;
手机(节点)端作为Server,手机(网页端)作为Client正常;
手机(节点)端作为S,台式(网页端)作为C无法握手>正常>简化如后;
手机(节点)端作为C,台式端(echo-server-copas.lua)作为S,手机报错‘org.java_websocket.exceptions.WebsocketNotConnectedException’>2次测试,简化如后
Windows(echo-server-copas.lua)(作为Server)与网页(websocket在线测试 (websocket-test.com))(作为Client)正常。(不清楚与更新v2.2-1相关否)>2次测试,简化如后
待测试手机-S,台式(lua)-C、电脑lua&网页..
简化描述:电脑Windows,简称W;手机安卓(Android),简称A;echo-server-copas.lua,简称L;websocket在线测试 (websocket-test.com),简称H;节点精灵,简称J;Server简称S、Client简称C。
测试:
WLS-AHC,×(30秒超时)
WLS-AJC,×(AJ报错:org.java_websocket.exceptions.WebsocketNotConnectedException,AJ的onError:c - error failed to connect to /192.168.2.241 (port 8080) from /:: (port 42850): connect failed: ETIMEDOUT (Connection timed out))
WHS-AJC,正常
WHC-AJS,正常
WLS-WHC,正常
WLC-WHS,正常
AJS-AHC,正常
AJC-AHS,正常
已解决,见下
WLC运行报错(不清楚与更新v2.2-1(可能不在于版本,而是非正确的新安装)相关否)
进而是WLC/S异常<新
AJS-WLC,当运行WLC时,AJS会onOpen,同时WLC报错attempt to call a nil value (global 'unpack')/xor_mask。
忽略了一个问题,以上报错中的unpack,不是Lua 5.3的标准函数了,即,库未支持Lua 5.3
WLC-AHS,正常
WLC-AJS,正常
WLC-WLS,正常(指定或默认protocol)
猜测是WLS、或网络(热点?)的问题,但同一个ip(即便同设备,使用显式ip,而非localhost),从WHC访问正常,但从AHC访问超时、从AJC报错..
已尝试更换其他热点,WLS问题依旧
HS貌似不分AHS、WHS,都是外部ip - bit的问题参见:lua安装bit所遇到的问题_12800522的技术博客_51CTO博客
github上有人Fork并更新了对Lua5.3的支持,考察如何(借助luarocks)安装。
有兼容方案,参见:AlberTajuelo/bitop-lua: Bitwise operators in pure Lua using Lua numbers (github.com)
Bitop-lua is not compatible with Lua 5.3 version(see: important define remove,提及报错Unknown number type, check LUA_NUMBER_* in luaconf.h)
测试:lua53.exe -e print(require'bit32'.bor)
待对比下LuaBitop与lua5.3 bit的差异,能否更换require。
参见:API Functions (luajit.org)(bitop)或AlberTajuelo/bitop-lua: Bitwise operators in pure Lua using Lua numbers (github.com)\BIT.bit,与3.4.2 – Bitwise Operators
提及更新且兼容的替换方案lua-http,但不支持Windows.
可能是来自ZeroBrane的问题。电脑中无bit32.lua或bit32.dll,但可以require'bit32'返回,猜测是来自Lua 5.2集成的库(虽然运行环境不是Lua 5.2了>Lua 5.3反对但兼容bit32,参见8.2 – Changes in the Libraries)。 - 测试更新的影响
台式使用的库路径有:C:\ProgramFiles\ZeroBraneStudio\lualibs\、C:\ProgramFiles\ZeroBraneStudio\share\lua\5.3\。
在其下有websocket.lua文件及websocket文件夹。
(未完整安装的)新版本(或新装的重复版本)导致以上WLC运行报错
现在一律回退旧版本(luaplus\Src\Modules\lua-websockets\src\websocket)(luaplus中有bitop,故而luaplus的websocket工作正常) - 当Windows Lua作为Server,(由)Android连接时,失败。其中节点精灵作为Client(AJC),报错org.java_websocket.exceptions.WebsocketNotConnectedException,会细分为:
当目标地址(及端口)无效时:c - error failed to connect to /X.X.X.X(port X) from /:: (port Z): connect failed: ECONNREFUSED (Connection refused)、c - error Host unreachable(当指定错误的末位ip时)
当连接Windows Lua时:c - error failed to connect to /Y.Y.Y.Y (port Y) from /:: (port Z): connect failed: ETIMEDOUT (Connection timed out)
其中手机网页端作为Client(AHC)报错等待服务器Websocket握手包直至超时后和服务器端口断开连接。(若使用错误的地址没有这么久的超时) - AJS不支持指定协议(P:protocol),若C端指定P,则C端可能报错:could not connect: Websocket Handshake failed: Invalid Sec-Websocket-Accept (expected xxxx= got nil)