B2B网络软件

标题: AIWROK函数没定义就调用脚本直接崩 [打印本页]

作者: YYPOST群发软件    时间: 1 小时前
标题: AIWROK函数没定义就调用脚本直接崩
AIWROK函数没定义就调用脚本直接崩
AIWROK函数没定义就调用脚本直接崩 B2B网络软件

AIWROK函数没定义就调用脚本直接崩 B2B网络软件

AIWROK函数没定义就调用脚本直接崩 B2B网络软件

  1. // ============================================================================
  2. //  AIWROK 避坑案例 #02(可跑演示):新手最常踩的 5 个坑
  3. // ============================================================================
  4. //
  5. //  这个脚本有什么用?
  6. //  ─────────────────
  7. //  新手刚接触 AIWROK 写脚本,90% 都会在这 5 个地方卡住:
  8. //    1. 函数没定义就调用 → 脚本直接崩
  9. //    2. 用 setTimeout → 找不到函数
  10. //    3. 用 Java 网络类 → 报未定义
  11. //    4. 开线程 → API 用错
  12. //    5. 主线程跑完 → 子线程全死
  13. //
  14. //  本脚本模拟一个"真实服务"的启动过程,演示正确写法。
  15. //  运行后会持续输出心跳日志,按【返回键】或【停止】退出。
  16. //
  17. //  怎么用:AIWROK 里直接运行本文件,观察日志输出。
  18. // ============================================================================


  19. // ============================================================================
  20. // 全局变量(坑1:必须在文件最顶部声明)
  21. // ============================================================================
  22. var G = {
  23.     running: true,
  24.     startTime: 0,
  25.     heartbeatCount: 0,
  26.     screen: { w: 1080, h: 1920 }
  27. };


  28. // ============================================================================
  29. // Java 类导入(坑3:必须先 importClass 才能用)
  30. // ============================================================================
  31. importClass(java.net.ServerSocket);
  32. importClass(java.net.InetSocketAddress);
  33. importClass(java.net.NetworkInterface);


  34. // ============================================================================
  35. // 工具函数(坑1:必须先定义,后调用)
  36. // ============================================================================

  37. // 获取屏幕尺寸
  38. function initScreen() {
  39.     try {
  40.         G.screen.w = screen.getScreenWidth();
  41.         G.screen.h = screen.getScreenHeight();
  42.     } catch (e) {
  43.         printl("[WARN] 获取屏幕尺寸失败,使用默认值");
  44.     }
  45.     printl("[初始化] 屏幕尺寸: " + G.screen.w + "x" + G.screen.h);
  46. }

  47. // 获取本机 IP
  48. function getLocalIP() {
  49.     try {
  50.         var interfaces = NetworkInterface.getNetworkInterfaces();
  51.         while (interfaces.hasMoreElements()) {
  52.             var iface = interfaces.nextElement();
  53.             if (iface.isLoopback() || !iface.isUp()) continue;
  54.             var addresses = iface.getInetAddresses();
  55.             while (addresses.hasMoreElements()) {
  56.                 var addr = addresses.nextElement();
  57.                 var host = addr.getHostAddress();
  58.                 if (host.indexOf(":") === -1) {  // 只取 IPv4
  59.                     return host;
  60.                 }
  61.             }
  62.         }
  63.     } catch (e) {}
  64.     return "127.0.0.1";
  65. }

  66. // 格式化运行时长
  67. function formatUptime() {
  68.     var elapsed = Math.floor((java.lang.System.currentTimeMillis() - G.startTime) / 1000);
  69.     var h = Math.floor(elapsed / 3600);
  70.     var m = Math.floor((elapsed % 3600) / 60);
  71.     var s = elapsed % 60;
  72.     return (h < 10 ? "0" : "") + h + ":" +
  73.            (m < 10 ? "0" : "") + m + ":" +
  74.            (s < 10 ? "0" : "") + s;
  75. }


  76. // ============================================================================
  77. // 主流程
  78. // ============================================================================

  79. function main() {
  80.     printl("═══════════════════════════════════════════════════════════");
  81.     printl("  AIWROK 避坑案例 #02 - 新手五大坑演示服务");
  82.     printl("═══════════════════════════════════════════════════════════");
  83.     printl("");

  84.     G.startTime = java.lang.System.currentTimeMillis();

  85.     // 阶段1:初始化(模拟真实服务启动流程)
  86.     printl("[阶段1/4] 初始化系统...");
  87.     java.lang.Thread.sleep(500);
  88.     initScreen();
  89.     java.lang.Thread.sleep(300);

  90.     // 阶段2:网络检测
  91.     printl("[阶段2/4] 检测网络环境...");
  92.     java.lang.Thread.sleep(500);
  93.     var ip = getLocalIP();
  94.     printl("[网络] 本机 IP: " + ip);
  95.     java.lang.Thread.sleep(300);

  96.     // 阶段3:模拟端口检测(坑3 的正确用法演示)
  97.     printl("[阶段3/4] 检测端口可用性...");
  98.     java.lang.Thread.sleep(500);
  99.     try {
  100.         var testPort = 32100;
  101.         var testSocket = new ServerSocket(testPort);
  102.         printl("[端口] " + testPort + " 可用 ✓");
  103.         testSocket.close();
  104.     } catch (e) {
  105.         printl("[端口] " + testPort + " 被占用,尝试下一个...");
  106.         testPort++;
  107.     }
  108.     java.lang.Thread.sleep(300);

  109.     // 阶段4:启动完成,进入心跳循环
  110.     printl("[阶段4/4] 启动完成,进入运行状态");
  111.     printl("");
  112.     printl("───────────────────────────────────────────────────────────");
  113.     printl("  服务已启动,按【返回键】或【停止】退出");
  114.     printl("───────────────────────────────────────────────────────────");
  115.     printl("");

  116.     // 坑2 的正确用法:用 runTime.setTimeout 做心跳,不用 setInterval
  117.     // 坑5 的正确用法:主线程用递归 setTimeout 保活,不会退出
  118.     startHeartbeat();
  119. }

  120. // 心跳函数(坑2+坑5 的正确写法)
  121. function startHeartbeat() {
  122.     G.heartbeatCount++;

  123.     // 每 3 秒输出一次状态
  124.     var uptime = formatUptime();
  125.     var memInfo = "";
  126.     try {
  127.         var runtime = java.lang.Runtime.getRuntime();
  128.         var usedMB = Math.floor((runtime.totalMemory() - runtime.freeMemory()) / 1048576);
  129.         memInfo = " | 内存: " + usedMB + "MB";
  130.     } catch (e) {}

  131.     printl("[心跳 #" + G.heartbeatCount + "] 运行时长: " + uptime + memInfo);

  132.     // 检查是否该退出(按返回键会设置 G.running = false)
  133.     if (!G.running) {
  134.         printl("");
  135.         printl("═══════════════════════════════════════════════════════════");
  136.         printl("  服务已停止,总运行时长: " + formatUptime());
  137.         printl("═══════════════════════════════════════════════════════════");
  138.         return;
  139.     }

  140.     // 递归调用自己(坑2 的正确写法:不用 setInterval)
  141.     runTime.setTimeout(startHeartbeat, 3000);
  142. }

  143. // ============================================================================
  144. // 启动
  145. // ============================================================================
  146. main();

  147. // 说明:按 AIWROK 界面上的【停止】按钮即可退出
复制代码







欢迎光临 B2B网络软件 (http://bbs.niubt.cn/) Powered by Discuz! X3.2