在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

    文章

    1378

    瀏覽量

    79315
  • UDP
    UDP
    +關注

    關注

    0

    文章

    327

    瀏覽量

    34051
  • ets
    ets
    +關注

    關注

    0

    文章

    20

    瀏覽量

    1637
  • OpenHarmony
    +關注

    關注

    25

    文章

    3749

    瀏覽量

    16599
收藏 人收藏

    評論

    相關推薦

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

    本項目Gitee倉地址:[深入淺出eTs學習: 帶大家深入淺出學習eTs (gitee.com)
    的頭像 發表于 05-17 15:08 ?1079次閱讀
    #<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 ?1003次閱讀
    #<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 ?1776次閱讀
    <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 ?958次閱讀
    <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 ?1665次閱讀
    <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>
    主站蜘蛛池模板: 欧美成人3d动漫在线播放网站 | 午夜精品久久久久久99热7777 | 成人啪啪网站 | 极品丰满翘臀后进啪啪 | 国产汉服被啪福利在线观看 | 国产综合色在线视频区色吧图片 | 九九51精品国产免费看 | 国产一级特黄高清免费大片 | 中韩日欧美电影免费看 | 一区二区三区在线免费 | 中国一级毛片aaa片 中国一级特黄aa毛片大片 | 四虎永久网址 | 天天爽夜夜操 | 一道精品一区二区三区 | 亚洲国产福利精品一区二区 | 激情文学综合丁香 | 亚洲免费成人网 | 欧美性色xo影院在线观看 | 伊人网综合在线观看 | 国内久久久久高清影视 | 欧美呜巴又大粗又长 | 特级黄一级播放 | 99久久免费精品高清特色大片 | 亚洲欧美日韩在线精品2021 | 国模啪啪一区二区三区 | 深夜视频在线播放视频在线观看免费观看 | 欧美日韩精品乱国产 | 日本国产黄色片 | 国产大片免费观看中文字幕 | 欧洲人体超大胆露私视频 | sss在线play | 伊人久久综合成人网小说 | 精品国产污污免费网站入口 | 色费女人18女人毛片免费视频 | 国产男女免费视频 | 无人码一区二区三区视频 | 免费看黄在线 | 天天在线看片 | 天天碰视频 | 免费在线观看大片影视大全 | 伊人网在线视频 |