基于openHarmony实现本地UDP通信

知识补充

简介

套接字(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,   // 绑定的IPfamily: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,   // 绑定的IPfamily: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.messagelet 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.mzph.cn/news/109804.shtml

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

相关文章

数据挖掘(5)分类数据挖掘:基于距离的分类方法

一、分类挖掘的基本流程 最常用的就是客户评估 1.1分类器概念 1.2分类方法 基于距离的分类方法决策树分类方法贝叶斯分类方法 1.3分类的基本流程 步骤 建立分类模型 通过分类算法对训练集训练&#xff0c;得到有指导的学习、有监督的学习预定义的类&#xff1a;类标号属性确定…

【软考】6.2 网络安全技术

《网络安全技术》 防火墙 一道大门&#xff0c;隔离内网和外网主要分隔外网的威胁&#xff0c;对内网的直接攻击无能为力 入侵检测系统&#xff08;IDS&#xff09; 位于防火墙后的第二道屏障监听设备&#xff1a;监控当前系统 / 用户行为&#xff0c;无需网络流量即可工作尽…

MySQL中如何进行分库分表的设计和实现?

分库分表是一种常用的数据库扩展方式&#xff0c;可以提高数据库的并发处理能力和扩展性&#xff0c;下面是分库分表的设计和实现的一般步骤&#xff1a; 数据库选择&#xff1a;选择合适的数据库管理系统&#xff08;DBMS&#xff09;&#xff0c;如MySQL&#xff0c;支持分库…

6.7 案例分析与实现

思维导图&#xff1a; 6.7 案例分析与实现 #### 案例6.2: 六度空间理论 【案例分析】 - **背景介绍**&#xff1a; 六度空间理论提及在任意两人之间最多仅有6个人的连接。尽管这一理论被广泛提及并得到了某种程度的验证&#xff0c;但从科学角度看&#xff0c;它仍然只是一…

214. Devu和鲜花

214. Devu和鲜花 - AcWing题库 如果每个盒子里的花的数量是无限的&#xff0c;用隔板法可以得出答案是 现在每个盒子中区的花数要满足n个条件 我们可以求答案的补集&#xff0c;用全部方案数减去补集方案数 每一个不符合条件的要求为&#xff0c;设为Bi 补集方案数为就成了…

24、Flink 的table api与sql之Catalogs(java api操作视图)-3

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…

7.MidBook项目经验之阿里OSS,微信支付(退款),定时任务,图表数据处理

1.阿里云实名认证 阿里云对象存储oss,标准高频率访问, 低频访问存储,归档存储(根本不经常访问) 冗余存储(备份) 读写权限(所有人还是自己访问) Component public class ConstantOssPropertiesUtils implements InitializingBean {不用注入,由spring创建bean使用流 MultipartFil…

Flask自定义装饰和g的使用

1. 在commons.py文件中新增一个装饰器类: 注&#xff1a;一定要加入wraps进行装饰否则&#xff0c;装饰器在给多个函数进行装饰时会报错 from functools import wraps from flask import session, current_app, g# 定义登陆装饰器&#xff0c;封装用户的登陆数据 def user_log…

软考-认证技术原理与应用

本文为作者学习文章&#xff0c;按作者习惯写成&#xff0c;如有错误或需要追加内容请留言&#xff08;不喜勿喷&#xff09; 本文为追加文章&#xff0c;后期慢慢追加 by 2023年10月 网络安全认证技术是指通过密码、数字证书、生物特征识别等手段&#xff0c;对使用网络的用…

【Mac】时间机器频繁提示磁盘没有正常推出

问题描述 有一次在进行时间机器备份的时候总是提示“磁盘没有正常推出”&#xff0c;并且好几次直接导致系统重启… 估计是 MacOS 系统 bug 解决 看了 Vex 一个帖子之后设置了一个硬盘是否休眠就好了&#xff0c;不要勾选让硬盘处于休眠就可以了&#xff0c;在电池选项界面中…

MySQL 8.0 OCP认证精讲视频、环境和题库之五 事务、缓存

redo log buffer&#xff1a; 缓存与事务有关的redo log ,用来对mysql进行crash恢复&#xff0c;不可禁用&#xff1b; 日志缓冲区是存储要写入磁盘上日志文件的数据的内存区域。日志缓冲区大小由innodb_Log_buffer_size变量定义。 默认大小为16MB。日志缓冲区的内容会定…

2023-10-17 mysql-从库从binlog回放事件-分析

摘要: 2023-10-17 mysql-从库从binlog回放事件-分析 上下文: 2023-10-17 mysql-配置主从-记录-CSDN博客 场景: 两个机器上分别装mysql一个mysql配置成master,另外一个配置成slave, 并建立主从关系配置binlog为row格式在master上insert一条数据在slave的handler接口ha_write…

微信小程序-4

一、使用scss编译wxss文件 1.vscode安装easysass扩展 vscode插件 - - - easysass - - - 安装 2.微信小程序 导入vscode扩展 开发者工具 - - - 视图 - - - 扩展 - - - 右侧三个点 - - - 导入已安装的vscode扩展 3.编辑 打开编辑器扩展目录&#xff0c;找到easysass文件夹&…

spring-statemachine 状态机自定义持久化入库

使用 spring-statemachine 状态机持久化时&#xff0c;可以通过内存、spring-statemachine-redis 或 spring-statemachine-data-jpa 现有方式持久化处理。 因项目审核操作记录频繁&#xff0c;数据量大&#xff0c;使用 内存 或 spring-statemachine-redis 模式不可取&#xf…

QTday02(常用类、UI界面下的开发、信号与槽)

今日任务 1. 使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#x…

v-model表单数据双向绑定-表单提交示例

示例如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>v-model表单数据双向绑定<…

354 俄罗斯套娃信封问题(贪心+二分)

题目 链接 给你一个二维整数数组 envelopes &#xff0c;其中 envelopes[i] [wi, hi] &#xff0c;表示第 i 个信封的宽度和高度。 当另一个信封的宽度和高度都比这个信封大的时候&#xff0c;这个信封就可以放进另一个信封里&#xff0c;如同俄罗斯套娃一样。 请计算 最多…

【17.19消失的两个数字】

目录 一、题目描述二、算法原理三、代码实现 一、题目描述 二、算法原理 三、代码实现 class Solution { public:vector<int> missingTwo(vector<int>& nums) {//找到a^bint temp0;for(auto num:nums){temp^num;}for(int i1;i<nums.size()2;i){temp^i;}//找…

Flink测试利器之DataGen初探 | 京东云技术团队

什么是 Flinksql Flink SQL 是基于 Apache Calcite 的 SQL 解析器和优化器构建的&#xff0c;支持ANSI SQL 标准&#xff0c;允许使用标准的 SQL 语句来处理流式和批处理数据。通过 Flink SQL&#xff0c;可以以声明式的方式描述数据处理逻辑&#xff0c;而无需编写显式的代码…

React 路由总结 react-router-dom6+react-router-dom5

开题 单页面应用和多页面应用 SPA&#xff1a;单页面应用程序&#xff0c;整个应用中只有一个页面(index.html) MPA&#xff1a;多页面应用程序&#xff0c;整个应用中有很多页面(*.html) react路由 现在的前端应用大多都是SPA单页面应用程序&#xff0c;也就是一个HTML页面的…