OpenHarmony socket之tcp

688 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第18天,点击查看活动详情 短信倒计时

背景

今天我们要用到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连接使用完毕后,主动关闭。

接下来,我们就开始正文。

新建项目

image-20220928084559438

点击下一步

image-20220928084642842

点击finish,等待依赖的加载

这个时候我们先来进行自动签名

image-20220928085556658

签完名,运行我们 的新项目

首先它是需要我们打开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
}

image-20221020222442627

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`);
      }
    })
  }
​

7.Socket连接使用完毕后,主动关闭。

  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');
  }

实验

把DAYU200开发板连上wifi(示例会显示获取的地址),注意和电脑连接的wifi相同。

然后就可以开心的玩耍了,这里要感谢各位的指导,不然也做不出来。