基于openHarmony实现本地UDP通信

news2024/11/19 15:16:22

知识补充

简介

套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议栈进行交互的接口,支持TCP/UDP/TLS协议。

基本概念

  • Socket:套接字,就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。
  • TCP:传输控制协议。是一种面向连接的、可靠的、基于字节流的传输层通信协议。
  • UDP:用户数据报协议协议。是一个简单的面向消息的传输层,不需要连接。
  • TLS:安全传输层协议。用于在两个通信应用程序之间提供保密性和数据完整性

搭建前端界面

新建项目
在这里插入图片描述
在这里插入图片描述

等待环境初始化
在这里插入图片描述

打开实时预览
在这里插入图片描述

前端基本实现效果

@Entry
@Component
struct Index {
  @State message: string = '本地UDP通信'
  @State value:string = 'null'

  build() {
    Column()
    {
      Text(this.message)
        .fontSize(30)
        .fontWeight(FontWeight.Bold)
        .margin({top:10,bottom:50})
      Row()
      {
        Text("发送信息"){}
        TextInput({placeholder:"输入要发送的内容"})
          .width('80%')
      }.width('80%')
      Button("发送")
        .width('50%')
        .margin({top:10,bottom:50})
      Row()
      {
        Text("接收的信息   ")
        Text(""){Span(this.value).fontColor(Color.Green).fontSize(30)}  // 用于显示所接受UDPServer的消息
      }.width('80%')
    }.width('100%').height('100%')
  }
}

在这里插入图片描述

主要代码

创建UDP
async createUDP()
{
    this.udpSocket=socket.constructUDPSocketInstance()  // 创建UDP Socket对象
    this.udpSocket.bind({
        address:this.address,   // 绑定的IP
        family:1    // 网络协议类型
    })
}

Socket连接信息

参数名类型说明
addressstring绑定的IP地址
familystring网络协议类型(IPv4或IPv6 默认为IPv4)
portnumber端口号:0~65535
sizenumber服务器响应信息的字节长度
关闭UDP
async closeUDP():Promise<void>
    {
    await this.udpSocket.close()  // 关闭连接
    this.udpSocket.off('message')  // 关闭订阅
this.udpSocket=null  // 赋null值
}
发送数据
async sendData(data:string,address:string,port:number):Promise<void>
    {
    let option={
        address:{
        address:address,
        port:port,
        family:1
},
    data:data
}

this.udpSocket.send(option)
}
添加onAppear事件

当组件显示时触发此回调

.onAppear(()=>{
    this.createUDP()  // 创建udpSocket对象
    this.udpSocket.on('message',(data)=>{  // 订阅消息
        let dataView=new DataView(data.message)
        let value=''
        for(let i=0;i<dataView.byteLength;++i)
        {
            value+=String.fromCharCode(dataView.getUint8(i))
        }
        this.value=value
    })
})
添加onAppear事件
.onDisAppear(()=>{
 	this.closeUDP()
})
添加控件事件
 TextInput({placeholder:"输入要发送的内容"})
          .width('80%')
          .onChange(value=>{this.outValue=value})  
// 当文本框中数值改变将内容存储到变量中
Button("发送")
    .width('50%')
    .margin({top:10,bottom:50})
    .onClick(()=>{
    if(this.outValue!='')  // 判断发送的值是否为空
	 this.sendData(this.sendValue,this.address,this.port)  // 发送数据
})

对程序进行签名

选择自动签名,一个月好像限制签名150次
在这里插入图片描述

添加网络权限

"requestPermissions": [
    {
        "name": "ohos.permission.INTERNET"
    },
],

在这里插入图片描述

使用SocketTool进行测试

创建一个UDPServer
在这里插入图片描述

开启本地模拟机,运行测试

初次连接,程序会自动给UDPServer发送一条UDP connection successful 信息
在这里插入图片描述

手动发送信息
在这里插入图片描述

UDP Server回复信息
在这里插入图片描述

整体代码

import socket from '@ohos.net.socket'
@Entry
@Component
struct Index {
  @State message: string = '本地UDP通信'
  @State sendValue:string = ''  // 输入框中要发送的值
  @State saveValue:string = 'Hi'   // 存储UDPServer发送的信息
  @State address:string = '172.16.30.134'  // 连接的IP地址
  @State port:number = 9999  // 连接的端口号

  private  udpSocket:socket.UDPSocket = null  // udp变量
  async createUDP()
  {
    this.udpSocket=socket.constructUDPSocketInstance()  // 创建UDP Socket对象
    this.udpSocket.bind({
      address:this.address,   // 绑定的IP
      family:1    // 网络协议类型
    })
  }

  async closeUDP():Promise<void>
  {
    await this.udpSocket.close()  // 关闭连接
    this.udpSocket.off('message')  // 关闭订阅
    this.udpSocket=null  // 赋null值
  }

  async sendData(data:string,address:string,port:number):Promise<void>
  {
    let option={
      address:{
        address:address,
        port:port,
        family:1
      },
      data:data
    }

    this.udpSocket.send(option)
  }

  build() {
    Column()
    {
      Text(this.message)
        .fontSize(30)
        .fontWeight(FontWeight.Bold)
        .margin({top:10,bottom:50})
      Row()
      {
        Text("发送信息"){}
        TextInput({placeholder:"输入要发送的内容"})
          .width('80%')
          .onChange(value=>{this.sendValue=value})  // 当文本框中数值改变将内容存储到变量中
      }.width('80%')
      Button("发送")
        .width('50%')
        .margin({top:10,bottom:50})
        .onClick(()=>{
          if(this.sendValue!='')  // 判断发送的值是否为空
            this.sendData(this.sendValue,this.address,this.port)  // 发送数据
        })
      Row()
      {
        Text("接收的信息   ")
        Text(""){Span(this.saveValue).fontColor(Color.Green).fontSize(30)}
      }.width('80%')
    }.width('100%').height('100%')
    .onAppear(()=>{
        this.createUDP()  // 创建udpSocket对象
        // this.sendData("UDP connection successful",this.address,this.port)
        this.udpSocket.on('message',(data)=>{
          let buffer=data.message
          let dataView=new DataView(buffer)
          let str=""
          for (let i =0;i<dataView.byteLength;++i)
          {
            str+=String.fromCharCode(dataView.getUint8(i))
          }
          this.saveValue=str
        })
    })
    .onDisAppear(()=>{
      this.closeUDP()
    })
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1105635.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MMDP: A Mobile-IoT Based Multi-Modal Reinforcement Learning Service Framework

框架 AHTT可被定义为 AHTT的元素表示智能体在动作为 a l m n a_{lmn} almn​的情况下从张量状态 s i j k s_{ijk} sijk​转移到另一个张量状态 s i j k ′ s_{ijk}^{} sijk′​的概率 通过数理统计首先得到多变量频率张量 状态 s i j k s_{ijk} sijk​的值函数等于策略 π…

凌恩快讯 | 凌恩生物联手墨卓生物,为中国科研注入国人力量!

金秋十月&#xff0c;丹桂飘香。 凌恩生物又添新设备&#xff0c;成功引进墨卓生物科技高稳定、高性价比的MobiNova单细胞解决方案&#xff0c;构建凌恩单细胞组学产线&#xff0c;这一产品线的构建&#xff0c;将极大拓展凌恩生物在农学、医学相关科研领域的服务范围&#xff…

全国400电话办理,简单步骤帮您申请成功

导语&#xff1a;随着企业业务的扩展和市场需求的增加&#xff0c;越来越多的企业开始关注全国400电话的申请。本文将为您介绍全国400电话的办理步骤&#xff0c;帮助您顺利完成申请过程。 正文&#xff1a; 一、了解全国400电话 全国400电话是一种虚拟电话号码&#xff0c;…

Uniapp 电子签名 包含 返回 撤回 颜色 线条等功能

请观看 使用教程 第一步 引入图标 在项目中的App.vue内添加下面代码 <style>/*引入图标路径 */import uni_modules/TC-qianming/libs/css/iconfont.css; </style> 第二步 引入组件即可 <template><view><TC-qianming></TC-qianming>&l…

Eolink Apikit 接口自动化测试流程

自动化测试是一种软件测试方法&#xff0c;利用自动化工具和脚本来执行测试用例&#xff0c;以验证软件应用程序的功能、性能、稳定性等特性。自动化测试的主要目的是提高测试效率、减少测试成本&#xff0c;并确保软件的质量和可靠性。 作为测试人员&#xff0c;在进行比较大…

定制AI问答机器人前需要准备什么数据来训练AI模型?

AI问答机器人利用自然语言处理&#xff08;NLP&#xff09;技术来理解和回应用户的查询&#xff0c;能通过分析大量数据提供准确和相关的答案。要定制一个AI问答机器人&#xff0c;收集必要的资源和工具是至关重要的。获取用于训练模型的数据集是个关键的基础&#xff0c;然后通…

uniapp(uncloud) 使用生态开发接口详情4(wangeditor 富文本, 云对象, postman 网络请求)

wangeditor 官网: https://www.wangeditor.com/v4/pages/01-%E5%BC%80%E5%A7%8B%E4%BD%BF%E7%94%A8/01-%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8.html 这里用vue2版本,用wangeditor 4 终端命令: npm i wangeditor --save 开始使用 在项目pages > sy_news > add.vue 页面中…

线程池扩容和拒绝策略(CallerRunsPolicy)验证

结论&#xff1a; 1、线程池队列容量满了后&#xff0c;迅速扩容至maxPoolSize 2、队列满后&#xff0c;再进来任务&#xff0c;则主线程执行任务 3、任务执行完后&#xff0c;等待&#xff08;keepAliveSeconds&#xff09;&#xff0c;主线程数然后恢复至corePoolSize 1、…

【音视频|ALSA】基于alsa-lib开发ALSA应用层程序--附带源码

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

【前端学习】—let const var之间的区别(十三)

【前端学习】—let const var之间的区别&#xff08;十三&#xff09; 一、let const var之间的区别 二、代码演示 <script>// 1、const let不存在变量提升 var 存在变量提升//var console.log(fullName,fullName);//fullName undefined //var fullNamecai; /* var 声明…

YOLO目标检测——肺结节数据集【含对应voc、coco和yolo三种格式标签】

实际项目应用&#xff1a;肺结节检测数据集主要应用于医学影像分析领域&#xff0c;特别是在肺结节检测和恶性风险评估方面。数据集说明&#xff1a;YOLO目标检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富。使用lableimg标注软件标注&#xff0c;标…

浅谈智能操控及无线测温产品在马来西亚理文造纸雪邦热电站项目中的应用

摘要&#xff1a;为避免因电线接头松动、电缆老化等引发高温造成火灾&#xff0c;所造成的的经济损失巨大&#xff0c;在一些电气设备如大电流电缆设备节点、电力设备局部异常升温部位、开关柜的动静触头&#xff0c;进线与出线母排接点、整流柜中的电气接点、变压器节点、变电…

win11 电脑 使用 python 连接USB 海康工业相机 运行示例程序 BasicDemo.py

win11 电脑 使用 python 连接USB 海康工业相机 运行示例程序 BasicDemo.py 1.下载海康的mvs客户端和mvs_sdk驱动 官网链接&#xff1a; https://www.hikrobotics.com/cn/machinevision/service/download?module0 下载这两个东西&#xff0c;然后安装 1.1 我的mvs安装在 F:\…

PHPstorm设置自定义代码自动提示,实现HTML页面的模版标签的提示

for {foreach $VAR0$ as $key>$vo } {/foreach}if {if $VAR0$$b }{else /}{/if}ifel {if $VAR0$$b}{elseif $a$b /}{else /}{/if}

不规则的文字环绕

不规则的文字环绕 我们将展示如何使用 CSS 的 shape-outside 和 clip-path 属性来实现不规则的文字环绕效果。 HTML 结构 首先&#xff0c;我们需要一个容器&#xff0c;其中包含一张图片和一段文字&#xff1a; <div class"container"><img src"i…

【算法tips】面试官:说说常见的排序算法。—— 巧记十种排序算法名称

做人呢最重要就是开心 面试时要放松、自信、从容&#xff0c; capybara教你巧记十种排序算法名称&#xff0c; 串联记忆&#xff0c;牢记不忘&#xff0c;快速忆起&#xff0c;从容回答。 十大经典排序算法 1.冒泡排序&#xff08;Bubble Sort&#xff09; 2.选择排序&…

Vue 模板字符串碰到script无法识别,报错Parsing error: Unterminated template.

需求&#xff1a; 将js代码完整的显示在界面上&#xff0c;包括标签 代码如下&#xff1a; 报错信息如下&#xff1a; 我们在上图中可以看到模板字符串加入了script标签后会报错 原因&#xff1a;运行JS的时候由上至下&#xff0c;先识别模板字符串里面的script标签&#xf…

svn 版本回退 并更新到最新

1.目前情况 (1)个人开发使用svn管理版本,没有分支只有主干. (2)最新版是89,想要完全回退到86,忽略所有86-89之间的变化 (3)直接回退后,提交的时候会提示更新(更新后又更新到最新版本了) (4)网上的教程测试都有问题(可能遇到的需求不一样) (5)工具为windows svn小乌龟 2.回…

Vue基础语法核心指令过滤器计算属性监听属性

目录 1. 模板语法 1.1 插值 1.1.1 文本 1.1.2 html 1.1.3 属性 1.1.4 表达式 1.2 指令 1.2.1 核心指令 1.2.1.1 v-if |v-else-if|v-else 1.2.1.2 v-show 1.2.1.3 v-for 1.2.1.4 v-on|v-model|v-for 1.2.1.5 参数 v-bind:href,v-on:click 1.2.1.6 简写 2. 过滤器…

优思学院|ISO9001管理体系从何而来?97%的专家不知道

ISO9001是当前全球最受欢迎的质量管理系统&#xff0c;特别是踏入21世纪以后&#xff0c;采用这套系统的政府部门、公营机构和企业数量都可谓几何级数上升。 截至2020年&#xff0c;ISO组织已向全球170个国家发出合共916842张ISO9001证书。 探源ISO9001的根源 那么&#xff…