AutoJs学习-聊天室
学习 聊天室 AutoJs
2023-09-14 09:04:17 时间
👉关于作者
众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考,于是我决定将自己的思考,经验和故事全部分享出来,以此寻找共鸣 !!!
专注于Android/Unity和各种游戏开发技巧,以及各种资源分享(网站、工具、素材、源码、游戏等)
有什么需要欢迎私我,交流群让学习不再孤单。
本文约5千字,新手阅读需要7分钟,复习需要2分钟 【收藏随时查阅不再迷路】
👉实践过程
"ui";
importClass("java.net.ServerSocket");
importClass("java.net.Socket");
importClass("java.net.InetAddress");
importClass("java.io.DataInputStream");
importClass("java.io.DataOutputStream");
const PORT = 10010;
ui.layout(
<vertical>
<appbar>
<toolbar id="toolbar" title="聊天室" />
</appbar>
<horizontal h="70" gravity="center_vertical">
<text textSize="14sp" textColor="#999999" text="邀请码: " marginRight="8"/>
<text id="code" textSize="16sp" textColor="#555555" w="0" layout_weight="1"/>
<button id="copy" text="复制" style="Widget.AppCompat.Button.Borderless.Colored" />
</horizontal>
<list id="messages" w="*" layout_weight="1" h="0" padding="12">
<horizontal>
<text textSize="16sp" textColor="#000000" text="{{this}}" />
</horizontal>
</list>
<horizontal>
<input id="input" layout_weight="1" w="0" />
<button id="send" text="发送" style="Widget.AppCompat.Button.Colored" />
</horizontal>
</vertical>
);
var messages = [];
activity.setSupportActionBar(ui.toolbar);
ui.messages.setDataSource(messages);
ui.send.on("click", () => {
let msg = {
content: String(ui.input.text()),
nickname: nickname
};
room.send(msg);
room.emit("message", msg);
ui.input.text("");
});
ui.copy.on("click", () => {
setClip(ui.code.text());
toast("已复制");
})
let storage = storages.create("org.autojs.autojs.jschat");
var nickname = storage.get("nickname", "");
dialogs.build({
title: "聊天室",
positive: "加入房间",
negative: "创建房间",
inputHint: "昵称",
inputPrefill: nickname
}).on("positive", (dialog) => {
nickname = String(dialog.inputEditText.text);
storage.put("nickname", nickname);
joinRoom();
}).on("negative", (dialog) => {
nickname = String(dialog.inputEditText.text);
storage.put("nickname", nickname);
createRoom();
}).show();
var room;
var writeThread = threads.start(function () {
setInterval(() => { }, 1000);
});
function joinRoom() {
let code = storage.get("code", "");
dialogs.rawInput("请输入邀请码", code)
.then(code => {
if (!code) {
ui.finish();
return;
}
ui.code.setText(code);
storage.put("code", code);
let ip = codeToIP(code);
threads.start(function () {
try{
room = RoomMember.joinRoom(ip, PORT);
listenRoom(room);
}catch(e){
console.error(e);
}
});
});
}
function createRoom() {
let ipv6 = getLocalIpV6();
if (!ipv6) {
toast("不支持ipv6!");
ui.finish();
return;
}
ui.code.setText(ipToCode(ipv6));
room = new RoomHost(PORT);
listenRoom(room);
}
function listenRoom(room) {
room.on("message", message => {
console.log("message: ", message);
ui.post(() => {
messages.push(message.nickname + ": " + message.content);
});
});
}
function codeToIP(code) {
let ip = String(java.lang.String(android.util.Base64.decode(code, 2)));
log("codeToIP: ip = %s, code = %s", ip, code);
return ip;
}
function ipToCode(ip) {
let code = android.util.Base64.encodeToString(java.lang.String(ip).getBytes(), 2);
log("ipToCode: ip = %s, code = %s", ip, code);
return code;
}
function getLocalIpV6() {
try {
for (let en = java.net.NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
let intf = en.nextElement();
for (let enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
let inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress() && !inetAddress.isLinkLocalAddress() && inetAddress instanceof java.net.Inet6Address) {
let ipaddress = inetAddress.getHostAddress().toString();
return ipaddress;
}
}
}
} catch (ex) {
console.error(ex);
}
return null;
}
function RoomHost(port) {
events.__asEmitter__(this);
var that = this;
this.server = new ServerSocket(port);
this.members = [];
this.listenThread = threads.start(function () {
try {
while (true) {
let socket = that.server.accept();
log("client connect: ", socket);
var member = new RoomMember(socket);
member.on("message", message => {
that.emit("message", message);
that.members.forEach(m => {
if (member != m) {
m.send(message);
}
});
});
that.members.push(member);
}
} catch (e) {
console.log(e);
}
});
events.on("exit", () => {
this.server.close();
});
}
RoomHost.prototype.send = function (data) {
this.members.forEach(member => {
member.send(data);
});
//this.emit("message", data);
}
function RoomMember(socket) {
this.socket = socket;
events.__asEmitter__(this);
this.inputStream = new DataInputStream(socket.getInputStream());
this.outputStream = new DataOutputStream(socket.getOutputStream());
var inputStream = this.inputStream;
this.messageId = 0;
var that = this;
this.readThread = threads.start(function () {
try {
let str;
while ((str = inputStream.readUTF()) != null) {
let json = JSON.parse(str);
console.log("socket %s receive: ", that.socket.toString(), json);
if (typeof (json.type) == "string") {
that.emit(json.type, json.data);
}
}
} catch (e) {
console.log(e);
}
});
}
RoomMember.prototype.send = function (message) {
var msg = {};
Object.assign(msg, message);
msg.from = this.socket.toString();
msg.id = this.messageId++;
var str = JSON.stringify({
type: "message",
data: msg
});
writeThread.setImmediate(() => {
this.outputStream.writeUTF(str);
});
}
RoomMember.joinRoom = function (hostIp, port) {
var socket = new Socket(hostIp, port);
let room = new RoomMember(socket);
toastLog("加入房间成功");
return room;
}
👉其他
📢作者:小空和小芝中的小空
📢转载说明-务必注明来源:https://zhima.blog.csdn.net/
📢这位道友请留步☁️,我观你气度不凡,谈吐间隐隐有王者霸气💚,日后定有一番大作为📝!!!旁边有点赞👍收藏🌟今日传你,点了吧,未来你成功☀️,我分文不取,若不成功⚡️,也好回来找我。
温馨提示:点击下方卡片获取更多意想不到的资源。
相关文章
- [破解] DRM-内容数据版权加密保护技术学习(上):视频文件打包实现
- 【STM32F407开发板用户手册】第12章 STM32F407的HAL库框架设计学习
- 学习Python想放弃,因为你没有培养自己的兴趣!
- ML之回归预测:利用13种机器学习算法对Boston(波士顿房价)数据集【13+1,506】进行回归预测(房价预测)来比较各模型性能
- hive学习(二) hive操作
- RISCV学习笔记5.4--ubuntu18.04安装vivado
- 深度学习笔记:UnknownError: Failed to get convolution algorithm
- 【Python】MongoDB数据库安装和Pymongo操作学习