深入浅出学习eTs之TCP聊天的功能实现

一、需求分析
本章节我们来实现一个tcp聊天的功能
连接指定ip和端口
显示接收的内容
具有发送的功能
二、控件介绍
(1)socket连接
场景介绍
应用通过socket进行数据传输,支持tcp和udp两种协议。
接口说明
socket连接主要由socket模块提供。具体接口说明如下表。
接口名 功能描述
constructudpsocketinstance() 创建一个udpsocket对象。
constructtcpsocketinstance() 创建一个tcpsocket对象。
bind() 绑定ip地址和端口。
send() 发送数据。
close() 关闭连接。
getstate() 获取socket状态。
connect() 连接到指定的ip地址和端口(仅tcp支持)
getremoteaddress() 获取对端socket地址(仅tcp支持,需要先调用connect方法)
on(type: ‘message’) 订阅socket连接的接收消息事件。
off(type: ‘message’) 取消订阅socket连接的接收消息事件。
on(type: ‘close’) 订阅socket连接的关闭事件。
off(type: ‘close’) 取消订阅socket连接的关闭事件。
on(type: ‘error’) 订阅socket连接的error事件。
off(type: ‘error’) 取消订阅socket连接的error事件。
on(type: ‘listening’) 订阅udpsocket连接的数据包消息事件(仅udp支持)。
off(type: ‘listening’) 取消订阅udpsocket连接的数据包消息事件(仅udp支持)。
on(type: ‘connect’) 订阅tcpsocket的连接事件(仅tcp支持)。
off(type: ‘connect’) 取消订阅tcpsocket的连接事件(仅tcp支持)。
基本例程(参考我之前的家庭医生终端系统)
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 { 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'); }) }} (2)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@componentstruct 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
(1)基本界面
以后不会大时间讲解ui了,会直接放成品,且我的源码都在gitee仓上存在,需要的可以自己下载,会着重体现程序部分
(2)接口绑定
首先是接收框处的变量绑定
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) (3)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)');});  
该部分实现聊天框内部的文字刷新
(4)ip设置
这里我是使用的合宙的tcp工具[wstool (luatos.com)](
在此处修改ip和端口
(5)远端模拟器
在模拟器中打开如上
四、实际测试
使用模拟器进行发送
在tcp工具处有接收到内容,此时进行回复
在app端可以接收到并显示(暂时可能只支持英文接受显示)
五、动态图
tcp助手显示如下


HDMI 2.1做了哪些功能升级
新能源滤波器的主要功能和作用有哪些?
运营商该怎么提高5G用户渗透率?
原理图到layout的设计输出
基于接地电极表面及与其接触的土壤之间的接触电阻
深入浅出学习eTs之TCP聊天的功能实现
直流电源滤波器的基本原理与优势
科学家首次实现操控光波和光子信息,标志通信基础设施将大幅提升
中本聪到底持有多少比特币
国产高性能32位M0内核MCU单片机DP32G003
华为为英国5G网络的推出提供了三分之一的基站
MODEM的系统硬件要求/接口类型/芯片组
CAN总线原理,CAN总线的8个特点
碳化硅的挑战与机遇
方案 | ST最新一代高灵敏度 STHS34PF80人体感应检测方案
深度解析工控行业最热门十个关键词
三相桥式逆变电路的原理和工作方式
百度Apollo计划发力广州自动驾驶智能交通新基建项目
BOM如何打通IPD与项目交付过程?
如何使用arduino制作情绪灯