鸿蒙上实现简单的聊天功能
需求分析:连接指定 IP 和端口 显示接收的内容 具有发送的功能
控件介绍 ①Socket 连接场景介绍:应用通过 Socket 进行数据传输,支持 TCP 和 UDP 两种协议。接口说明:Socket 连接主要由 socket 模块提供。具体接口说明如下表。
基本例程(参考我之前的家庭医生终端系统): import socket from "@ohos.net.socket"; let tcp = socket.constructTCPSocketInstance(); tcp.bind({address: "0.0.0.0", port: 12121, family: 1}, err => { if (err) { console.log("bind fail"); return; } console.log("bind success"); }) tcp.on("message", value => { console.log("on message, message:" + value.message + ", remoteInfo:" + value.remoteInfo) let da = resolveArrayBuffer(value.message); let dat_buff = String(da); //此处对接受到的数据进行处理 }); //将接受到的数据转化为文本型 function resolveArrayBuffer(message){ if (message instanceof ArrayBuffer) { let dataView = new DataView(message) let str = "" for (let i = 0;i < dataView.byteLength; ++i) { let c = String.fromCharCode(dataView.getUint8(i)) if (c !== " ") { str += c } } return str; } } //数据的发送函数 function send_once(Con_buff) { if (flag == false) { let promise = tcp.connect({ address: { address: "xxx.xxx.xxx.xxx", port: xxxx, family: 1 }, timeout: 2000 }); promise.then(() => { console.log("connect success"); flag = true; tcp.send({ data: Con_buff }, err => { if (err) { console.log("send fail"); return; } console.log("send success"); }) }).catch(err => { console.log("connect fail"); }); } else if (flag == true) { tcp.send({ data: Con_buff }, err => { if (err) { console.log("send fail"); return; } console.log("send success"); }) } }②AppStorage 与组件同步
在管理组件拥有的状态中,已经定义了如何将组件的状态变量与父组件或祖先组件中的 @State 装饰的状态变量同步,主要包括 @Prop、@Link、@Consume。
本章节定义如何将组件变量与 AppStorage 同步,主要提供 @StorageLink 和 @StorageProp 装饰器。 @StorageLink 装饰器
组件通过使用 @StorageLink(key) 装饰的状态变量,与 AppStorage 建立双向数据绑定,key 为 AppStorage 中的属性键值。
当创建包含 @StorageLink 的状态变量的组件时,该状态变量的值将使用 AppStorage 中的值进行初始化。
在 UI 组件中对 @StorageLink 的状态变量所做的更改将同步到 AppStorage,并从 AppStorage 同步到任何其他绑定实例中,如 PersistentStorage 或其他绑定的 UI 组件。 @StorageProp 装饰器
组件通过使用 @StorageProp(key) 装饰的状态变量,将与 AppStorage 建立单向数据绑定,key 标识 AppStorage 中的属性键值。
当创建包含 @StoageProp 的状态变量的组件时,该状态变量的值将使用 AppStorage 中的值进行初始化。
AppStorage 中的属性值的更改会导致绑定的 UI 组件进行状态更新。 let varA = AppStorage.Link("varA") let envLang = AppStorage.Prop("languageCode") @Entry @Component struct ComponentA { @StorageLink("varA") varA: number = 2 @StorageProp("languageCode") lang: string = "en" private label: string = "count" private aboutToAppear() { this.label = (this.lang === "zh") ? "数" : "Count" } build() { Row({ space: 20 }) { Button(`${this.label}: ${this.varA}`) .onClick(() => { AppStorage.Set("varA", AppStorage.Get("varA") + 1) }) Button(`lang: ${this.lang}`) .onClick(() => { if (this.lang === "zh") { AppStorage.Set("languageCode", "en") } else { AppStorage.Set("languageCode", "zh") } this.label = (this.lang === "zh") ? "数" : "Count" }) } } }
即通过 AppStorage.Link 和 @StorageLink 的方式,可实现外部动态刷新 Text 组件和 image 组件(等等之类都可以),方便我们在全局调用时更新数据。
UI 设计
本项目的基本内容是可以在预览器中看到的,所以先在预览器中简单设计 UI。 ①基本界面
以后不会大时间讲解 UI 了,会直接放成品,且我的源码都在 Gitee 仓上存在,需要的可以自己下载,会着重体现程序部分。 ②接口绑定
首先是接收框处的变量绑定: let Rc_message = AppStorage.Link("Rc_message") @StorageLink("Rc_message") Rc_message: String = "收到消息" Text(`${this.Rc_message}`) .width("98%") .height("35%") .borderStyle(BorderStyle.Solid).borderWidth(8).borderColor(0xAFEEEE).borderRadius(20) .fontSize(25)
③TCP 回调设置 tcp.on("message", value => { console.log("on message, message:" + value.message + ", remoteInfo:" + value.remoteInfo) let da = resolveArrayBuffer(value.message); let dat_buff = String(da); AppStorage.Set("Rc_message",dat_buff); //AppStorage.Set("ID_1_stata","rgba(0, 109, 229, 0.95)"); });
该部分实现聊天框内部的文字刷新。 ④IP 设置
这里我是使用的合宙的 TCP 工具[wstool (luatos.com)](
在此处修改 IP 和端口:
⑤远端模拟器
在模拟器中打开如上。
实际测试
使用模拟器进行发送:
在 TCP 工具处有接收到内容,此时进行回复。
在 APP 端可以接收到并显示(暂时可能只支持英文接受显示)。
动态图
TCP 助手显示如下:
本项目 Gitee 仓地址:https://gitee.com/lalhan/eTs_Study
翔宇医疗2022年实现营收4。89亿元,净利润1。21亿元大河财立方消息2月10日,翔宇医疗披露2022年业绩快报。2022年,翔宇医疗实现营业收入4。89亿元,同比减少6。68归母净利润1。21亿元,同比减少39。98扣非净利润6516
2022年,河南省社会消费品零售总额同比增长0。1大河财立方消息2月8日,河南省统计局发布20222023年河南省消费品市场形势分析与展望。2022年,全省上下认真贯彻落实党中央国务院和省委省政府各项决策部署,统筹推进疫情防控和经
终于名正言顺!普尔库里回来之前能不能进季后赛就看我的了勇士官方宣布库里韧带伤病缺席一段时间。随后主教练科尔接受了媒体的采访时表示在谈到库里缺阵期间的阵容变化时普尔将在库里缺阵期间担任球队首发!库里我累了先休息一下,球队靠你俩压阵了!库
德雷蒙德格林不喜欢欧文交易,因为独行侠太难防了勇士前锋德雷蒙德格林在自己的播客中,谈到了凯里欧文被交易到独行侠之事。我不喜欢。我不喜欢的原因是,他们将很难被防住,很难被防住。凯里欧文,是我们见过最优秀的得分手之一,可能是历史最
浓眉詹姆斯是我个人取得成功的重要部分他值得所有的一切直播吧2月8日讯今日NBA常规赛,湖人在主场以130133不敌雷霆。湖人球星安东尼戴维斯赛后接受了采访。当被问及如何看待詹姆斯超越贾巴尔成为历史得分王时,浓眉说道他是我们球队能取得
高调离开!美媒提湖人3换3交易,从根本上一劳永逸!新世纪以来不少球员都给我们带来了非常多的惊喜,其中如今公牛队的悍将拉文显然是其中的一员了,在近来刚刚结束的比赛当中,拉文高效砍下41分打破所有人质疑的表现尽显男儿本色,恰逢不少球员
马德兴中超新政出台整体较为积极,各方反应还是可以接受直播吧2月8日讯昨天,由中国足协与中国职业足球俱乐部联合会筹备组召集中超中甲中乙三级职业俱乐部负责人参加的职业联赛工作会议在香河足球基地进行。会议期间,相关的政策计划等已经向与会代
法国杯2遭淘汰北京时间2月9日凌晨4点,202223赛季法国杯18决赛迎来一场焦点战,巴黎圣日耳曼客场挑战马赛。上半场,拉莫斯送点,桑切斯主罚命中为马赛先拔头筹,补时阶段拉莫斯将功补过头球扳平比
英超2利兹联瓦拉内送乌龙拉什福德桑乔破门北京时间2月9日凌晨4点,202223赛季英超联赛第8轮一场补赛在老特拉福德进行,曼联主场迎战利兹联。上半场,尼奥托在开场第1分钟就为利兹联取得领先下半场,瓦拉内打进乌龙球,随后拉
锡安确定不会参加全明星据ESPN记者AndrewLopez报道,鹈鹕球星锡安威廉姆森因为腿筋伤势,确定不会参加全明星。鹈鹕主帅威利格林确认了这一消息,并表示锡安会在全明星后接受复查。这位22岁的年轻球星
湖人三方交易得到拉塞尔,威少加盟爵士,森林狼得到康利ESPN记者Woj报道,多位消息人士称,湖人和森林狼爵士达成交易。湖人得到森林狼后卫迪安吉洛拉塞尔爵士球员马利克比斯利前锋贾里德范德比尔特。森林狼得到爵士控卫迈克康利爵士后卫尼基尔