色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

深入淺出學習eTs之TCP聊天的功能實現

Harmony&嵌入式學習 ? 來源:Harmony&嵌入式學習 ? 作者:Harmony&嵌入式學 ? 2023-05-13 13:27 ? 次閱讀

一、需求分析

wKgZomRfH9iAHR7gAARCUmVyfbg568.png

本章節我們來實現一個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 < dataView.byteLength; ++i) {
      let c = String.fromCharCode(dataView.getUint8(i))
      if (c !== "n") {
        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');
    })
  }
}

(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
@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

(1)基本界面

wKgaomRfH9iAXkxLAACH9xv0dpY079.png

以后不會大時間講解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)](

wKgZomRfH9mAfeieAABRQ6an6lE467.png

在此處修改IP和端口

wKgaomRfH9mAR_YJAADyC-hJSMw960.png

(5)遠端模擬

wKgZomRfH9qAcLNSAAFD_6-9MIY732.png

在模擬器中打開如上

四、實際測試

wKgaomRfH9qAKrexAAEkrnzdjrY871.png

使用模擬器進行發送

wKgZomRfH9uAV7aaAACOqG6V6WE909.png

在TCP工具處有接收到內容,此時進行回復

wKgaomRfH9yADI94AABvBsINwBE053.png

在APP端可以接收到并顯示(暫時可能只支持英文接受顯示)

wKgZomRfH9yASo__AAEjyjkuI_U462.png


wKgaomRfH92AHGRrAACM1tKj4Nc016.png


wKgZomRfH92AXr8PAAErrS-4flY198.png

五、動態圖

wKgaomRfH96AC6OtAAmOwGpABEI516.gif

TCP助手顯示如下

wKgZomRfH96AQflyAACkliKb1l8025.png


編輯:黃飛

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • TCP
    TCP
    +關注

    關注

    8

    文章

    1377

    瀏覽量

    79183
  • UDP
    UDP
    +關注

    關注

    0

    文章

    327

    瀏覽量

    34009
  • ets
    ets
    +關注

    關注

    0

    文章

    20

    瀏覽量

    1626
  • OpenHarmony
    +關注

    關注

    25

    文章

    3744

    瀏覽量

    16473
收藏 人收藏

    評論

    相關推薦

    #深入淺出學習eTs#(八)“猜大小”小游戲

    本項目Gitee倉地址:[深入淺出eTs學習: 帶大家深入淺出學習eTs (gitee.com)
    的頭像 發表于 05-17 15:08 ?1055次閱讀
    #<b class='flag-5'>深入淺出</b><b class='flag-5'>學習</b><b class='flag-5'>eTs</b>#(八)“猜大小”小游戲

    #深入淺出學習eTs#(十)藍藥丸還是紅藥丸

    本項目Gitee倉地址: 深入淺出eTs學習: 帶大家深入淺出學習eTs (gitee.com)
    的頭像 發表于 05-17 15:07 ?981次閱讀
    #<b class='flag-5'>深入淺出</b><b class='flag-5'>學習</b><b class='flag-5'>eTs</b>#(十)藍藥丸還是紅藥丸

    ARM7 深入淺出學習

    深入淺出ARM7 LPC213x_214 學習
    發表于 12-04 17:28

    深入淺出Android

    深入淺出Android
    發表于 04-26 10:48

    深入淺出排序學習使用指南

    深入淺出排序學習:寫給程序員的算法系統開發實踐
    發表于 09-16 11:38

    #深入淺出學習eTs#(六)編寫eTs第一個控件

    本項目Gitee倉地址:深入淺出eTs學習: 帶大家深入淺出學習eTs (gitee.com)一
    發表于 12-29 10:05

    #深入淺出學習eTs#(七)判斷密碼是否正確

    本項目Gitee倉地址:深入淺出eTs學習: 帶大家深入淺出學習eTs (gitee.com)一
    發表于 12-29 10:06

    #深入淺出學習eTs#(十九)TCP聊天

    本項目Gitee倉地址:深入淺出eTs學習: 帶大家深入淺出學習eTs (gitee.com)一
    發表于 12-29 13:59

    深入淺出Cortex-M0學習資料

    深入淺出Cortex-M0學習資料
    發表于 06-18 10:50 ?0次下載
    <b class='flag-5'>深入淺出</b>Cortex-M0<b class='flag-5'>學習</b>資料

    STM32深入淺出新手篇

    STM32深入淺出新手篇,很好的單片機學習資料。
    發表于 03-21 17:43 ?128次下載

    深入淺出學習250個通信原理資源下載

    深入淺出學習250個通信原理資源下載
    發表于 04-12 09:16 ?28次下載

    深入淺出學習低功耗藍牙協議棧

    深入淺出學習低功耗藍牙協議棧
    發表于 06-23 10:35 ?57次下載

    深入淺出學習eTs(一)模擬器/真機環境搭建

    本項目的Gitee倉地址: 深入淺出eTs學習: 帶大家深入淺出學習eTs (gitee.com
    的頭像 發表于 05-13 13:17 ?1743次閱讀
    <b class='flag-5'>深入淺出</b><b class='flag-5'>學習</b><b class='flag-5'>eTs</b>(一)模擬器/真機環境搭建

    深入淺出學習eTs(七)如何判斷密碼是否正確

    本項目Gitee倉地址: 深入淺出eTs學習: 帶大家深入淺出學習eTs (gitee.com)
    的頭像 發表于 05-13 13:20 ?933次閱讀
    <b class='flag-5'>深入淺出</b><b class='flag-5'>學習</b><b class='flag-5'>eTs</b>(七)如何判斷密碼是否正確

    深入淺出學習eTs九宮格密碼鎖功能實現

    本項目Gitee倉地址:深入淺出eTs學習: 帶大家深入淺出學習eTs (gitee.com)
    的頭像 發表于 05-13 13:25 ?1631次閱讀
    <b class='flag-5'>深入淺出</b><b class='flag-5'>學習</b><b class='flag-5'>eTs</b><b class='flag-5'>之</b>九宮格密碼鎖<b class='flag-5'>功能</b><b class='flag-5'>實現</b>
    主站蜘蛛池模板: 有人在线观看的视频吗免费| 在线观看亚洲专区5555| 中文无码不卡的岛国片国产片| 国产无遮挡无码视频在线观看不卡 | 最美白嫩的极品美女ASSPICS| 久久99国产视频| 在线亚洲97se| 免费麻豆国产黄网站在线观看| 国产性夜夜性夜夜爽91| 手机在线免费| 国产久久亚洲美女久久| 我就去色色| 狠狠干老司机| 啪啪做羞羞事小黄文| 小黄文污到你湿| 99久久精品国产国产毛片| 毛片免费播放| beeg xxx日本老师| 日韩黄色免费| 国产成人精品永久免费视频| 麻豆婷婷狠狠色18禁久久| 91亚洲精品福利在线播放| 国语自产视频在线不卡| 日韩精品亚洲专区在线影院| 大岛优香久久中文字幕| 午夜爽喷水无码成人18禁三级 | 国产精品1卡二卡三卡四卡乱码 | 嫩草欧美曰韩国产大片| 草草久久久亚洲AV成人片 | 黄桃AV无码免费一区二区三区| 色偷偷综合网| 国产偷抇久久精品A片蜜臀AV | 亚洲精品动漫免费二区| 久久免费看少妇高潮A片特爽| 99精品在线| 我的年轻漂亮继坶三级| 久久精品嫩草影院免费看| 拔萝卜在线高清观看视频| 亚洲AV日韩AV欧美在线观看网 | 综合人妻久久一区二区精品| 欧美做真爱欧免费看|