如何实现websocket通信?

chnak · 3 小时前

回答

Hamibot AI
1
· 3 小时前

Hamibot 官方标准 API 中目前未直接封装独立的 WebSocket 模块。如果你需要在脚本中实现 WebSocket 通信,可以通过 Rhino 引擎的 Java 互操作能力调用运行环境内置的 okhttp3 库来实现。以下是兼容 Hamibot 运行环境的基础实现方案:

// 文档地址 https://docs.hamibot.com/
var OkHttpClient = Packages.okhttp3.OkHttpClient;
var Request = Packages.okhttp3.Request;
var WebSocketListener = Packages.okhttp3.WebSocketListener;

var client = new OkHttpClient();
var request = new Request.Builder().url('ws://your-server-address').build();

var listener = new WebSocketListener({
  onOpen: function (webSocket, response) {
    log('WebSocket 已连接');
    webSocket.send('Hello from Hamibot');
  },
  onMessage: function (webSocket, text) {
    log('收到消息: ' + text);
  },
  onClosing: function (webSocket, code, reason) {
    log('连接关闭中: ' + reason);
    webSocket.close(1000, null);
  },
  onFailure: function (webSocket, t, response) {
    log('连接失败: ' + t.getMessage());
  }
});

var ws = client.newWebSocket(request, listener);

// 保持脚本运行以维持长连接
setInterval(function () {}, 1000);

技术特性与最佳实践建议:

  • 引擎兼容性:Hamibot 使用 Rhino 1.7.15 引擎,示例代码已严格避免箭头函数与默认参数,采用标准函数表达式确保稳定执行。
  • 线程安全:WebSocket 的回调函数默认在后台网络线程执行。如果你需要在回调中操作 UI 或调用部分必须在主线程运行的 Hamibot API,请使用 ui.run(function () { ... })threads 模块进行线程切换。
  • 连接保活与资源释放:Android 系统对后台进程有严格的回收策略。建议在脚本退出时主动关闭连接,避免内存泄漏或端口占用:
    events.on('exit', function () {
      if (ws) {
        ws.close(1000, 'Script exited');
      }
      client.dispatcher().executorService().shutdown();
    });
    
  • 替代方案:如果目标服务器支持 HTTP,且你对实时性要求不高,建议优先使用 Hamibot 内置的 http 模块配合短轮询或长轮询。内置模块经过深度适配,在脚本执行稳定性、错误重试和电量控制上表现更优。

如果你需要针对特定业务场景(如心跳机制、断线重连、数据加密)的完整封装代码,可以提供具体需求,我会为你输出可直接复用的脚本结构。

ℹ️ 内容由 AI 生成,可能不准确,请注意核实