• Lua Websockts


    • 参见: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)的异步之并行
      并行方式中,libevCopas对外的依赖重。
      两者使用不同,如ws:on_messagews:receive(节点精灵中是基于线程,进而使用onMessage
    • 当前环境中存在的(现成的)应用:luaplus\Src\Modules\lua-websocketsluaplus\Src\Modules\copas\copasZeroBraneStudio\lualibs\copas
      C:\Users\RobertLin\luaplus\Src\Modules\bitop
    • 客户端使用websocket URLws_url,如ws://localhost:80)连接服务端
    • 参见lua-websockets\API.md
      客户端
      • 建立websocket.client.syncwebsocket.client.new)、websocket.client.copas
      • 连接client:connect(ws_url,[protocol])client:close([code],[reason])
      • 访问client:receive()client:send(message,[type])
        服务端:
      • 配置config.portinterface(网络设备)、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/start

      c=webSocketClient("ws://ip:port")
      c:onOpen(相当于onStart、onConnect?)/onError/onMessage/connect

    • 尝试构建lua-websocket
      C:\Users\X>luarocks install lua-websockets 命令语法不正确。 Installing https://luarocks.org/lua-websockets-v2.2-1.rockspec Missing dependencies for lua-websockets v2.2-1:    luabitop (not installed)    copas (not installed)  lua-websockets v2.2-1 depends on luabitop (not installed) Installing https://luarocks.org/luabitop-1.0.1-1.src.rock  Do not use 'module' as a build type. Use 'builtin' instead. cl /nologo /MD /O2 -c -Fobit.obj -IC:\ProgramFiles\lua\lua53\include bit.c bit.c bit.c(79): fatal error C1189: #error:  "Unknown number type, check LUA_NUMBER_* in luaconf.h"  Error: Failed installing dependency: https://luarocks.org/luabitop-1.0.1-1.src.rock - Build error: Failed compiling object bit.obj

      估计未使用到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)会报错。
    • 节点精灵,通过子线程同时运行服务端、客户端,工作正常;
      手机(节点)端作为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博客
      g
      ithub上有人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)
  • 相关阅读:
    java下载url图片链接
    mysql 设计索引的原则
    169. 多数元素
    263. 丑数
    markdown 语法笔记
    70.爬楼梯
    540. 有序数组中的单一元素
    88. 合并两个有序数组
    面试题57
    152. 乘积最大子序列
  • 原文地址:https://www.cnblogs.com/RobertL/p/15911138.html
Copyright © 2020-2023  润新知