autojs-双向通信

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 牙叔教程 简单易学

牙叔教程 简单易学


使用场景

socketIO


socketIO

SocketIO是在客户端和服务端之间建立的双向通信数据交换技术,在即时通讯、通知与消息推送,实时分析等场景中有较为广泛的应用。


效果展示


autojs版本

8.7.7-0


代码简介

通信是双向的, 所以既有客户端, 也有服务端


1. 服务端

使用koa框架搭建, 使用的主要模块是 "socket.io": "^4.0.1"


2. 客户端

socketIO模块依赖 implementation('io.socket:socket.io-client:2.0.0')

用android studio调试成功以后, 转成dex供给autojs使用


get知识点

  1. koa搭建socketIO
  2. autojs使用socketIO
  3. listView的item_bind, 添加控件监听事件
  4. 常见的socketIO使用方法
  5. 多用户的管理
  6. 多用户的消息传递
  7. 添加新用户, listView自动滚动到最底部, 让新添加的用户进入视野
  8. 随机颜色
  9. 获取用户对应的socket连接
  10. 用户进入房间, 用户离开房间
  11. 用户上线, 用户下线
  12. 格式化时间
  13. 调用java的字符串格式化
  14. 随机字符串
  15. nodemon的使用


代码讲解

服务端

1. 主脚本
io.on("connection", (socket) => {
  console.log("已连接" + socket.id);
  socket.on("userLogin", (userName) => {
  ...
  });
  socket.on("disconnect", function () {
  ...
  });
  socket.on("deleteUser", function (userName) {
  ...
  });
  socket.on("joinRoom", function (userName, roomName) {
  ...
  });
  socket.on("leaveRoom", function (userName) {
  ...
  });
  socket.on("chat", function (chatContent) {
  ...
  });
});


2. nodemon启动服务, 这样代码修改了不用自己再重启了
"dev": "nodemon index.js -i README.md"
npm run dev


客户端

1. 导入socketio依赖
let dexPath = "./classes_merge.dex";
log(dexPath);
runtime.loadDex(dexPath);


2. 导入需要使用的类
importClass(Packages.io.socket.client.IO);
importClass(Packages.io.socket.client.Socket);
importClass(Packages.io.socket.emitter.Emitter);
importClass(Packages.io.socket.engineio.client.transports.Polling);
importClass(Packages.io.socket.engineio.client.transports.WebSocket);


3. UI, 一共四个页面
配置页面, 用于增加删除用户
大厅页面, 用户上线离线日志
房间1号日志页面.  1号房间的用户出入记录, 以及发言记录
2号, 3号 与1号用途类似


<vertical>
  <button id="回到配置页">
    回到配置页
  </button>
  <viewpager id="viewpager">
    <vertical>
      增删用户页面
    </vertical>
    <vertical padding="8">
      大厅日志页面
    </vertical>
    <vertical padding="8">
      房间1号日志页面
    </vertical>
    <vertical padding="8">
      房间2号日志页面
    </vertical>
    <vertical padding="8">
      房间3号日志页面
    </vertical>
  </viewpager>
</vertical>


4. 初始化用户数据
let userList = yashuUtil.getUserList();
ui.userList.setDataSource(userList);


5. 更新日志

由于更新日志的方法类似, 都是更新textView的内容, 只是viewId不一样, 所以要方法复用

function 更新日志(日志viewId, data) {
  let oldContent = ui[日志viewId].text();
  let newContent = oldContent + "\n" + data + yashuUtil.getTime();
  ui.run(function () {
    ui[日志viewId].setText(newContent);
  });
}


6. 用户点击单选按钮, 来选择进入那个房间
itemView.房间列表.setOnCheckedChangeListener(function (radioGroup, id) {
  let item = itemHolder.item;
  let viewId = radioGroup.getCheckedRadioButtonId();
  if (viewId !== -1) {
    let radioView = ui.findView(viewId);
    let value = radioView.getText().toString();
    if (radioView.checked) {
      let roomName = value;
      item.socket.emit("joinRoom", item.name, roomName);
    }
  }
});


7. 离开房间
itemView.leave.click(function () {
  itemView.房间列表.clearCheck();
  let item = itemHolder.item;
  item.socket.emit("leaveRoom", item.name);
});


8. 用户发言
itemView.send.click(function () {
  if (itemView.chatContent.text().length < 1) {
    log("聊天内容为空");
    return false;
  }
  let item = itemHolder.item;
  let user = yashuUtil.getCurrentUser(item.socket);
  if (user) {
    if (user.roomName) {
      item.socket.emit("chat", itemView.chatContent.text() + "   ");
    } else {
      log("用户没有加入房间");
    }
  } else {
    log("没找到用户");
  }
});


9. socket连接时, 注册监听事件
mSocket = IO.socket(baseUrl);
mSocket.on(Socket.EVENT_CONNECT, onConnect);
mSocket.on("disconnect", onDisconnect);
mSocket.on("userLogin", onUserLogin);
mSocket.on("userExit", onUserExit);
mSocket.on("joinedRoom", onJoinedRoom);
mSocket.on("leftRoom", onLeftRoom);
mSocket.on("chat", onChat);
mSocket.connect();


10. 退出时, 释放资源
events.on("exit", function () {
  yashuUtil.deleteAllUser();
});


参考文章


声明

部分内容来自网络








相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
Android开发
autojs之保活
autojs打包的app经常在后台被杀,请做到以下几点来保活: autojs版本号
2071 0
autojs之保活
|
Android开发
autojs用ConnectivityManager实现网络监听
autojs用ConnectivityManager实现网络监听
1098 0
|
4月前
|
XML JSON Java
Android App开发即时通信中通过SocketIO在客户端与服务端间传输文本和图片的讲解及实战(超详细 附源码)
Android App开发即时通信中通过SocketIO在客户端与服务端间传输文本和图片的讲解及实战(超详细 附源码)
288 0
|
缓存 Android开发
【开发一个简单的音乐播放器+服务端】【二】
【开发一个简单的音乐播放器+服务端】【二】
86 0
|
JSON Java 数据库连接
【开发一个简单的音乐播放器+服务端】【一】
【开发一个简单的音乐播放器+服务端】【一】
129 0
|
Web App开发 API
chrome插件的通讯
chrome插件的通讯
|
存储 Android开发
autojs之通信
通信概念 两个主体, 相互之间交换信息
535 0
|
Web App开发 网络协议 Java
WebSocket 开发指南
春节假期看了一下 websocket, 做了一篇笔记, 原文链接: https://oolap.com/websocket     WebSocket 由来已久, 常用于 "服务器推" 场景。最近开始学习 WebSocket (从 tomcat examples 开始), 本文的主要目的是做学习笔记, 同时记录一份开发指南。  &nbs
11448 0
|
消息中间件 Android开发 存储
15.源码阅读(安卓消息机制)
根据消息机制,手写了一个简单的handler模型,便于理解消息机制的原理,源码在GitHub:https://github.com/renzhenming/MyHandler.
731 0