autojs-双向通信

牙叔教程 简单易学

使用场景

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();
});

下载源码


参考文章

声明

部分内容来自网络

bilibili

牙叔教程

微信公众号 牙叔教程

在这里插入图片描述

QQ群

747748653
在这里插入图片描述

在这里插入图片描述

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牙叔教程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值