天天看點

OpenHarmony socket之tcp

背景

今天我們要用到socket

應用通過Socket進行資料傳輸,支援TCP和UDP兩種協定。

本文我将帶大家來使用

如何 使用 Socket子產品實作 DAYU200開發闆 和 Windows PC (SocketTool 工具)的之間的資料傳輸。

Socket 子產品可以用來進行資料傳輸,支援TCP和UDP兩種協定。

在我測試的時候發現UDP收發資料有點問題,是以我在這兒用tcp方式給大家示範。

我們先來看一下具體接口說明。

接口名 功能描述
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支援)。

開發步驟

UDP與TCP流程大體類似,下面以TCP為例:

  1. import需要的socket子產品。
  2. 建立一個TCPSocket連接配接,傳回一個TCPSocket對象。
  3. (可選)訂閱TCPSocket相關的訂閱事件。
  4. 綁定IP位址和端口,端口可以指定或由系統随機配置設定。
  5. 連接配接到指定的IP位址和端口。
  6. 發送資料。
  7. Socket連接配接使用完畢後,主動關閉。

接下來,我們就開始正文。

建立項目

OpenHarmony socket之tcp

點選下一步

OpenHarmony socket之tcp

點選finish,等待依賴的加載

這個時候我們先來進行自動簽名

OpenHarmony socket之tcp

簽完名,運作我們 的新項目

首先它是需要我們打開socket權限,以及擷取wifi位址權限。

"reqPermissions": [
      {
        "name": "ohos.permission.INTERNET"  //socket權限
      },
      {
        "name": "ohos.permission.GET_WIFI_INFO" //擷取wifi位址權限
      }
    ]      

接下來我們就需要通過TCP協定實作資料的收發

示範環境:

DAYU200 :

OpenHarmony 3.2.7.5 ETS API9

DevEco Studio 3.0 Release Build Version: 3.0.0.993, Windows 10 10.0

“compileSdkVersion”: 9, “compatibleSdkVersion”: 9,

實作

1.import需要的socket子產品及輔助子產品。

import socket from '@ohos.net.socket';
//wifi子產品,用于擷取目前IP位址
import wifi from '@ohos.wifi';      

2.建立一個TCPSocket連接配接,傳回一個TCPSocket對象。

//tcp連接配接對象
let tcp = socket.constructTCPSocketInstance();
//目标位址和端口
let targetAddr = {
    address: '172.20.10.2',  //要通信的 PC位址,CMD--->ipconfig檢視
    family: 1,
    port: 0 //UDP:7001/TCP:8001      
OpenHarmony socket之tcp

3.可選)訂閱TCPSocket相關的訂閱事件。

訂閱了connect 、message、close 事件。message事件的回調中可以擷取接收到的資料,

tcpInit() {
    tcp.on('connect', () => {
      this.status = '已連接配接'
      console.info("on tcp connect success");
    });
    tcp.on('message', value {
      console.log("==收到消息:" + value.message + ", remoteInfo:" + value.remoteInfo)
    });
    tcp.on('close', () => {
      console.info("on tcp close success");
    });
  }      

4.綁定IP位址和端口,端口可以指定或由系統随機配置設定。

//bind本地位址
    tcp.bind({ address: this.localAddr.address, port: 8001, family: 1 })
      .then(() => {
        console.info(`bind tcp success`);
      }).catch(err {
      console.info(`bind tcp failed ${err}`);
      return      

5.連接配接到指定的IP位址和端口

tcpConnect() {
    tcp.getState()
      .then((data) => {
        console.info(`====${JSON.stringify(data)}`)
        if (data.isClose) {
          this.tcpInit()
        }

        //開始連接配接
        tcp.connect(
          {
            address: { address: targetAddr.address, port: 8001, family: 1 }, timeout: 6000
          }
        ).then(() => {
          console.info(`connect success`);

        }).catch((error) => {
          console.info(`connect failed ${JSON.stringify(error)}`);
        })

      })
  }      

6.發送資料。

tcpSend() {
    //檢視狀态
    tcp.getState().then((data) => {
      console.info(`====${JSON.stringify(data)}`)
      //已連接配接,就發送資料
      if (data.isConnected) {
        //發送消息
        tcp.send(
          { data: this.message_send, }
        ).then(() => {
          console.info(`send success`);
        }).catch((error) => {
          console.info(`send failed ${JSON.stringify(error)}`);
        })
      } else {
        console.info(`not connect`);
      }
    })
  }      
tcpClose() {
    tcp.close().then(() => {
      this.status = '已斷開'
      console.info(`tcp.close success`)
    }).catch((err) => {
      console.info(`tcp.close error:${JSON.stringify(err)}`)
    })
    tcp.off('close');
    tcp.off('message');
    tcp.off('connect');
  }      

實驗