首页 文章 精选 留言 我的

精选列表

搜索[HarmonyOS],共1235篇文章
优秀的个人博客,低调大师

HarmonyOS实战—页面跳转

欢迎大家关注我的CSDN博客:https://xdr630.blog.csdn.net/ 实现步骤: ①:编写第一个页面(文本+按钮) xml编写 ②:编写第二个页面(文本) java 编写 ③:给按钮添加一个跳转 设计思路: 第一步:在第一个界面中把HelloWorld改写为第一个界面,并添加一个按钮。 第二步:写第二个界面 第三步:书写跳转关系 鸿蒙UI中,提供了两种编写布局的方式: 在XML中声明UI布局 在代码中创建布局 这两种方式创建出的布局没有本质差别,但是XML方式较为方便简单,以后开发中,也都是用XML布局的方式。 但是这两种方式都需要我们熟悉。所以,所以我们将通过XML的方式布局第一张页面,然后再通过代码的方式布局第二张页面。 1. 第一个页面布局(xml编写) 打开layout下面的“ability_main.xml”文件 在“ability_main.xml”文件中创建一个文本Text和一个按钮Button xml 编写 match-context 相当于 安卓中的 wrap_content <!--?xml version="1.0" encoding="utf-8"?--> <directionallayout xmlns:ohos="http://schemas.huawei.com/res/ohos" ohos:height="match_parent" ohos:width="match_parent" ohos:alignment="center" ohos:orientation="vertical"> <text ohos:id="$+id:text_helloworld" ohos:height="match_content" ohos:width="match_content" ohos:background_element="$graphic:background_ability_main" ohos:layout_alignment="horizontal_center" ohos:text="第一个页面" ohos:text_size="40vp" /> <button ohos:id="$+id:but1" ohos:height="match_content" ohos:width="match_content" ohos:background_element="red" ohos:text_size="40fp" ohos:text="点我"> </button> </directionallayout> 2. 第二个页面布局(java编写) java 代码编写 创建 : 删除 layout 下的ability_second.xml 注释掉报错的这段: DirectionalLayout 布局,是从上往下的排列 SecondAbilitySlice public class SecondAbilitySlice extends AbilitySlice { @Override public void onStart(Intent intent) { super.onStart(intent); //super.setUIContent(ResourceTable.Layout_ability_second); // 1. 创建布局对象 DirectionalLayout d1 = new DirectionalLayout(this); //2. 创建文本对象 Text t = new Text(this); //设置内容 t.setText("第二个页面"); //设置文字大小 t.setTextSize(55); //设置文字颜色 t.setTextColor(Color.BLUE); //3.把文本对象添加到布局中 d1.addComponent(t); //4.把布局添加到子界面当中 super.setUIContent(d1); } 3. 页面跳转实现 MainAbilitySlice public class MainAbilitySlice extends AbilitySlice implements Component.ClickedListener { Button but; @Override public void onStart(Intent intent) { super.onStart(intent); super.setUIContent(ResourceTable.Layout_ability_main); //1. 找到按钮 id but = (Button) findComponentById(ResourceTable.Id_but1); //2.给按钮添加点击事件 //如果没有添加点击事件,那么用鼠标点击按钮是没有任何反应 //如果添加了点击事件,鼠标点击之后就可以执行对应的代码了 // but.setClickedListener(this); } @Override public void onActive() { super.onActive(); } @Override public void onForeground(Intent intent) { super.onForeground(intent); } @Override public void onClick(Component component) { //点击按钮只要执行的代码 //跳转到第二个页面 if (component == but ){ //只有点击个按钮,才能跳转 //跳转到哪个页面中(意图) Intent i = new Intent(); //包含了页面跳转的信息 Operation operation = new Intent.OperationBuilder() //要跳转到哪个设备上,如果传递一个空的内容,表示跳转到本机 .withDeviceId("") //要跳转到哪个应用上,小括号里面可以写包名 .withBundleName("com.example.myapplication") //要跳转的页面 .withAbilityName("com.example.myapplication.SecondAbility") //表示将上面的三个信息进行打包 .build(); //把打包之后的operation设置到意图当中 i.setOperation(operation); //跳转页面 startAbility(i); } } } 点击后跳转到第二个页面

优秀的个人博客,低调大师

HarmonyOS实战—实现相亲APP

简易版 相亲APP 实现如下效果: 如果喜欢就点击下面的“联系方式”,不喜欢就点击“下一个” 1. 布局实现 新建项目:MakeFriendsApplication 把以下九个girl图片复制到 media 文件夹下 有需要上面图片素材的小伙伴可以自取:https://www.aliyundrive.com/s/j59dy5redPR 当然也可以自己在网上找,图片信息如下: 可以在上面的实现看到布局是由:一个图片+三个文本+两个按钮 组成的 布局实现: ability_main <?xml version="1.0" encoding="utf-8"?> <DirectionalLayout xmlns:ohos="http://schemas.huawei.com/res/ohos" ohos:height="match_parent" ohos:width="match_parent" ohos:alignment="center" ohos:orientation="vertical"> <Image ohos:id="$+id:img" ohos:height="match_content" ohos:width="match_content" ohos:image_src="$media:girl1"/> <Text ohos:id="$+id:name" ohos:height="50vp" ohos:width="150vp" ohos:text="姓名:王美花" ohos:text_size="20fp"/> <Text ohos:id="$+id:age" ohos:height="50vp" ohos:width="150vp" ohos:text="年龄:29" ohos:text_size="20fp"/> <Text ohos:id="$+id:address" ohos:height="50vp" ohos:width="150vp" ohos:text="地址:南京" ohos:text_size="20fp"/> <Button ohos:id="$+id:next" ohos:height="50vp" ohos:width="150vp" ohos:background_element="#92D050" ohos:text="下一个" ohos:text_size="20fp" ohos:text_color="#FFFFFF"/> <Button ohos:id="$+id:get" ohos:height="50vp" ohos:width="150vp" ohos:background_element="#92D050" ohos:text="获取联系方式" ohos:text_size="20fp" ohos:text_color="#FFFFFF" ohos:top_margin="10vp"/> </DirectionalLayout> 运行: 2. 核心业务逻辑实现 先找到组件对象 业务:点击了按钮“下一个”就要修改上面的信息,能不能把上面的信息看作成一个整体的对象? 现在有9个相亲对象,点击“下一个”的时候,就会随机把一个相亲对象的信息去显示在上面。 创建一个Javabean类去描述女朋友信息,有了Javabean类后才能在代码中创建对象 在domain中新建类名为:GirlFriend,在类中的属性有哪些? 如:图片、姓名、地址、年龄都是GirlFriend类中的属性 在资源管理器中获取图片,发现girl图片是int类型的 所以在JavaBean中GirlFriend类中图片类型使用int类型 其他属性使用对应的类型 最后生成标准的JavaBean即可 package com.xdr630.makefriendsapplication.domain; public class GirlFriend { //照片 private int photoID; //姓名 private String name; //年龄 private int age; //地址 private String address; //空参 + 全参:alt + insert public GirlFriend() { } public GirlFriend(int photoID, String name, int age, String address) { this.photoID = photoID; this.name = name; this.age = age; this.address = address; } public int getPhotoID() { return photoID; } public void setPhotoID(int photoID) { this.photoID = photoID; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } } 创建好了Javabean,就可以创建一个集合装9个相亲的对象,使用集合来存储了,ArrayList,泛型就可以直接写创建好的GirlFriend 类 在以后学习了和服务器交互之后,这些数据都是从服务器获取的,就不是一个一个添加了 下面就是手动添加数据来源 创建一个女朋友对象(new GirlFriend )并添加到 list 当中 为了方便,省的去查看Javabean中属性的排序,Ctrl + P 就可以查看参数了 添加完成9个对象 接着给按钮添加点击事件,两个按钮都要添加,分别是“next”和“get”按钮 实现本类中点击事件 当next按钮被点击后,就会执行本类中的onClick方法 get 按钮同上也要添加单击事件 然后在 onClick 方法中判断点击是 next 按钮 或 get 按钮 因为在 onClick 方法中要用到按钮的对象,所以把按钮的对象提升为 成员变量 才能在onClick方法中被访问的到,用到哪个就提哪个,这些组件都用的到,所以都提为成员变量。 在下面onClick方法当中,要从集合中获取girl信息,所以集合也要提为成员变量 Random对象也放在成员位置,表示在程序启动之后就创建了一个,如果放在onClick方法中,当点击一次就创建一次,内存冗余。 MainAbilitySlice package com.xdr630.makefriendsapplication.slice; import com.xdr630.makefriendsapplication.ResourceTable; import com.xdr630.makefriendsapplication.domain.GirlFriend; import ohos.aafwk.ability.AbilitySlice; import ohos.aafwk.content.Intent; import ohos.agp.components.Button; import ohos.agp.components.Component; import ohos.agp.components.Image; import ohos.agp.components.Text; import java.util.ArrayList; import java.util.Random; public class MainAbilitySlice extends AbilitySlice implements Component.ClickedListener { Image img; Text name; Text age; Text address; Button next; Button get; ArrayList<girlfriend> list = new ArrayList&lt;&gt;(); @Override public void onStart(Intent intent) { super.onStart(intent); super.setUIContent(ResourceTable.Layout_ability_main); //1.找到组件对象 img = (Image) findComponentById(ResourceTable.Id_img); name = (Text) findComponentById(ResourceTable.Id_name); age = (Text) findComponentById(ResourceTable.Id_age); address = (Text) findComponentById(ResourceTable.Id_address); next = (Button) findComponentById(ResourceTable.Id_next); get = (Button) findComponentById(ResourceTable.Id_get); //2.创建一个集合装9个相亲的对象 //添加9个对象 //在以后学习了和服务器交互之后,这些数据都是从服务器获取的 list.add(new GirlFriend(ResourceTable.Media_girl1,"王美花1",29,"南京")); list.add(new GirlFriend(ResourceTable.Media_girl2,"王美花2",30,"上海")); list.add(new GirlFriend(ResourceTable.Media_girl3,"王美花3",31,"武汉")); list.add(new GirlFriend(ResourceTable.Media_girl4,"王美花4",28,"长沙")); list.add(new GirlFriend(ResourceTable.Media_girl5,"王美花5",25,"南昌")); list.add(new GirlFriend(ResourceTable.Media_girl6,"王美花6",26,"杭州")); list.add(new GirlFriend(ResourceTable.Media_girl7,"王美花7",23,"深圳")); list.add(new GirlFriend(ResourceTable.Media_girl8,"王美花8",22,"北京")); list.add(new GirlFriend(ResourceTable.Media_girl9,"王美花9",24,"广州")); //3.给按钮添加点击事件 next.setClickedListener(this); get.setClickedListener(this); } @Override public void onActive() { super.onActive(); } @Override public void onForeground(Intent intent) { super.onForeground(intent); } Random r = new Random(); @Override public void onClick(Component component) { if (component == next){ //点击的是下一个 --- 换一个girl的信息 //从集合中获取一个随机的girl的信息 //获取一个随机索引 int randomIndex = r.nextInt(list.size()); //通过随机索引获取随机girl信息 GirlFriend girlFriend = list.get(randomIndex); //把随机出来的信息设置到界面当中 img.setImageAndDecodeBounds(girlFriend.getPhotoID()); name.setText("姓名:" + girlFriend.getName()); age.setText("年龄:" + girlFriend.getAge()); address.setText("地址:" + girlFriend.getAddress()); }else if (component == get){ //获取联系方式 //扩展:可以跳转到界面让用户充值界面,充值后才能看到girl信息 } } } 运行: 点击“下一个” 当点击“下一个”按钮时,信息也会随之一起获取的到,所以有需求的小伙伴可以扩展下,当点击“下一个”按钮时信息是隐藏的,只有当点击“获取联系方式”时才能显示出对应的信息,或也可以添加充值页面,当点击“获取联系方式”时,就跳转到充值页面,只有充值完后才能看到对应的信息。

优秀的个人博客,低调大师

HarmonyOS实战之入门 HelloWorld

欢迎大家关注我的CSDN博客:https://xdr630.blog.csdn.net/ 第一个入门应用:HelloWorld 新建完项目之后,自带HelloWorld,在第一个案例中,我们主要学习以下几点: 1. 如何运行项目 登录账号,Tools-->Device Manager 或 点击右上角的头像 选择并开启模拟器,这个模拟器是不需要下载的,运行在华为的服务器上,不占用本地资源 每次运行时不超过一个小时,超过了重新开启就行了 运行项目 2. 页面中的包含关系 在鸿蒙当中,一个页面就是一个Ability 为什么要有子页面的存在呢? 直接在最外面的页面里面添加文本信息不更简单吗? 一个鸿蒙APP安装包结构如下,一个 Ability 对应 一个 Hap 包 把三个 hap 包打包成一个 APP 鸿蒙有个特点:可分、可合 如果要使用这个APP,不需要完整的把这个APP下载给安装,用到什么就下载什么,而APP中每一个Hap包都是可以单独下载并安装的 举例:构建 游戏功能.hap 3. 学习项目的配置文件:config.json app deviceConfig module 4. 了解程序的运行过程

优秀的个人博客,低调大师

HarmonyOS NEXT】地图使用详解(二)

踏入鸿蒙世界的敲门砖,标志着您在技术征途上的全新起点,提升就业竞争力,获得行业认可,点亮职业成长先机,快人一步抢占未来应用开发赛道!https://developer.huawei.com/consumer/cn/training/dev-cert-detail/101666948302721398 背景 上篇文章对开发环境初始化进行了讲解,这篇文章是对地图Picker系列组件的讲解。包括地点选取模块和地点详情展示模块。 地点选取模块(sceneMap.chooseLocation) · 参数 · 返回值 Promise 地点选取初始化参数(LocationChoosingOptions) location · 地图中心点坐标。如果参数未传,使用设备当前位置作为中心点;如果未获取到设备当前位置,默认以故宫博物院为中心点。 language · 地图组件显示的语言。仅支持中文和英文,zh_CN和en poiTypes · 指定需要展示的poi类别。取值范围需要查看HwLocationType searchEnabled · 是否展示搜索控件,默认值为false。true:展示;false:不展示 showNearbyPoi · 是否展示附近poi,默认值为false。true:展示;false:不展示 snapshotEnabled · 是否返回映射快照,默认值为false。true:返回;false:不返回 地点选择返回值(LocationChoosingResult) siteId · 选择的地点ID,如果选测试非Poi(即手动滑动到随便某个位置),则不返回 location · 选点的坐标点。返回mapCommon.Latlng值 name · 选点的Poi名称。非Poi时,返回name值为标记点 address · 选点的地址信息 addressComponent · 选点地址的详细信息。返回site.AddressComponent值,包括国家名字,行政区,地区等信息。 zoom · 选点地址的缩放层级。 snapshot · 地图快照。返回图片类型 代码 实现效果 地点详情展示模块(sceneMap.queryLocation) 由官方提供的地点详情展示模块,可以实现快速调用页面,查看地点详情。 · 参数 LocationQueryOptions(查询地点详情设置参数) 需要注意点,如果没有填写siteid参数时,需要同时填写location和name才能实现页面的定位 siteId · 地点详情页的地点ID。 language · 语言。当前仅支持中文和英文,取值:zh_CN、en。 location · 地图中心点坐标。如果没有siteId,使用location查询地点详情。 name · 地点的名称。如果没有siteId,使用name作为location的名称标注。 address · 地点的地址。如果没有siteId,使用address作为location的地址标注。 showBusiness · 是否显示商业信息(如打车),默认值为true。 代码 实现效果 · 当选择的地址是Poi时,ID和Name都可以正常显示 · 当选择地址不是Poi时,ID是为undefined的,Name可以正常显示 总结 这里展示了官方提供的两种地图组件的使用方式,希望可以让你对这两个组件的使用有更深的理解(转载自CSDN,作者:baobao熊)

优秀的个人博客,低调大师

HarmonyOS 6】获取华为用户信息

踏入鸿蒙世界的敲门砖,标志着您在技术征途上的全新起点,提升就业竞争力,获得行业认可,点亮职业成长先机,快人一步抢占未来应用开发赛道!https://developer.huawei.com/consumer/cn/training/dev-cert-detail/101666948302721398 背景 这篇文章主要记录,个人开发者在获取华为用户授权后,拿到用户的头像和名字。获取用户的电话号码的获取需要应用获得scope权限,现仅对企业开发者开放。 环境配置 在项目中生成证书请求文件(CSR) · 在build->Generate Key and CSR中选择 · 根据下面填写内容生成CSR文件 · 创建Key store,密码要记住的哈~~ · 输入Alias(别名)后面再项目结构配置的时候需要填写的哈,要记住。(尴尬,写到才发现单词写错了。。。) · 保存CSR地址,点击Finish完成创建 在AGC中创建项目 · 在证书、APPID和Profile中创建APP · 新建证书,然后下载证书,后续的项目配置需要使用 · 新建Profile,并下载后续给项目配置使用 · 在项目中添加公钥指纹,选择自己新建的公钥 在项目结构中手动添加证书 先查看Bundle name和AGC的项目上填写的是否一致。像我这里的,AGC是com.myapp.accentdemo,项目的是com.example.accountdemo,因此,需要先调整好Bundle name 在AppScope的app.json5文件中进行修改 在Signing Configs选项卡中配置项目信息 配置Client ID,在Entry->module.json5中添加Client ID,在AGC中复制ID 获取用户信息代码编写 UI · 需要引用 authentication 和 ImageType 获取用户信息请求对象代码 · 通过authentication.HuaweiIDProvider().createAuthorizationWithHuaweiIDRequest()的方式创建请求对象 授权请求对象几个重要的属性: · scopes:获取用户数据,与permissions属性不能同时为空,否则会报错,默认值:[‘openid’]。其中的参数有 profile:华为账号用户的基本信息,如昵称头像等。 openid:华为账号用户的OpenID、UnionID。UnionID作为用户标识,OpenID为用户在当前应用的用户标识。 phone:华为账号快速验证手机号,需要scope权限,也就是企业用户哈。 quickLoginAnonymousPhone:获取华为账号绑定的匿名手机号,需要scope权限,也就是企业用户哈。 · permissions:用于获取用户授权临时凭据和用户身份认证信息,与scopes属性不能同时为空。 serviceauthcode:用户授权临时凭据。 idtoken:用户身份认证信息。 · forceAuthorization:表示华为账号未登录时,是否需要强制拉起华为账号登录页。默认值:true。 · state:随机数并做一致性校验。该参数与响应体中返回的state比较。 · nonce:该参数会包含在返回的ID Token中,通过校验一致性,可用于防止重放攻击。 · idTokenSignAlgorithm:默认值:PS256,用于指定ID Token的签名算法。 · supportAtomicService:在元服务场景下,当传入scopes包含profile时,是否支持获取用户头像昵称。如果该值为true,可以正常获取用户头像昵称。如果该值为false,执行授权请求将返回1001500003 错误代码。 获取请求数据 请求返回的结果 · data:用户授权结果数据,可以查看SDK文档,AuthorizationWithHuaweiIDCredential · state:响应体中返回的state 完整代码 实现的效果如下 · 未授权时,会有弹窗提示: · 然后就可以显示用户头像和名字了 (转载自CSDN,作者:baobao熊)

优秀的个人博客,低调大师

HarmonyOS NEXT】地图使用详解(一)

踏入鸿蒙世界的敲门砖,标志着您在技术征途上的全新起点,提升就业竞争力,获得行业认可,点亮职业成长先机,快人一步抢占未来应用开发赛道!https://developer.huawei.com/consumer/cn/training/dev-cert-detail/101666948302721398 背景 这系列文章主要讲解鸿蒙地图的使用,当前可以免费使用,并提供了丰富的SDK给开发者去自定义控件开发。目前可以实现个性化显示地图、位置搜索和路径规划等功能,轻松完成地图构建工作。需要注意的是,现在测试只能使用实体手机去做调试,模拟器和预览器是没有办法做测试和使用的。 地图开发环境搭建 1.AGC中创建项目 在AGC中新建项目,并复制AGC项目中的Client ID 填写到工程中的entry模块的module.json5文件中,新增metadata,配置name为client_id,value为AGC项目中的Client ID。 2.AGC中开通地图服务 在API管理界面,打开地图服务 3.AGC中创建APP 在证书、APP ID和Profile中,APP ID中创建之前项目中的App 4.在项目文件中生成密钥请求文件 这个密钥文件比较重要,务必妥善保存。 这里的Alias需要记住,后面需要用到 保存csr文件 查看生成的csr文件 5.AGC项目中创建证书和设备 新建调试证书,并把证书下载到本地。 6.AGC项目中创建Profile 选择对应的调试证书,完成Profile的创建 7.把生成的证书和调试文件添加到项目结构中 8.确保当前IDE已经登陆了你的华为账号 地图组件(MapComponent) · 示例代码使用MVVM架构来配置 1、MapComponent组件初始化 · 提供了两个必填参数,mapOptions和mapCallback · 项目初始化框架 · VM中的MapOption赋值 · VM中的MapCallBack赋值 · 权限申请(在VM中封装申请) 权限方法封装 · 项目加载时,先进行VM的初始化 · 界面初始化展示 2、地图初始化类(MapOptions) 属于mapCommon类 · 常用属性 · 在VM类中,需要在类初始化的时候把MapOption初始化。 3、获取手机用户当前位置 通过geoLocationManager的getCurrentLocation方法,获取用户的坐标经纬度,然后封装成更新用户定位的方法,在初始化的时候调用,就可以实现手机打开后会直接更新到用户的位置 完整代码 · Page · ViewModel · PermissionUtils 总结 上面的流程是地图组件的初始化的个人理解流程,看完这篇希望可以在地图开发上给你提供帮助。(转载自CSDN,作者:baobao熊)

优秀的个人博客,低调大师

HarmonyOS NEXT】Calendar Kit日历管理

踏入鸿蒙世界的敲门砖,标志着您在技术征途上的全新起点,提升就业竞争力,获得行业认可,点亮职业成长先机,快人一步抢占未来应用开发赛道!https://developer.huawei.com/consumer/cn/training/dev-cert-detail/101666948302721398?ha_source=hmosclass-csdn&ha_sourceId=89000445 简介 Calendar Kit提供日历与日程管理能力,包括日历的获取和日程的创建能力。 Calendar Kit为用户提供了一系列接口来获取日历账户,并使用特定的接口向日历账户中写入日程。 如果写入的日程带有提醒时间则系统会在时间到达时向用户发送提醒。 约束点 ·需要用户手动授权获取读取、写入日历日程的权限。 ·仅支持stage模型。 ·从api11开始支持 相关知识 配置需要的权限 在module.json5中配置所需申请的权限 在EntryAbility中配置权限和日历管理器 EntryAbility中检查用户是否确认权限: 日历管理器(CalendarManager) 提供了添加、删除、获取日历账户的相关方法。如果不需要关注日程(Event)的账户(Calendar)归属时,可以直接使用getCalendar方法直接获取。 相关方法如下: 日历账户(Calendar) 可以对账户中的日程进行创建、删除、修改、查询等操作,还有日历配置信息、日历账户信息等方法 日程(Event) (转载自51CTO,作者:奥尼5354)

优秀的个人博客,低调大师

HarmonyOS网络管理开发—Socket连接

简介 Socket连接主要是通过Socket进行数据传输,支持TCP/UDP/TLS协议。 基本概念 ​ ● Socket:套接字,就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。 ​ ● TCP:传输控制协议(Transmission Control Protocol)。是一种面向连接的、可靠的、基于字节流的传输层通信协议。 ​ ● UDP:用户数据报协议协议(User Datagram Protocol)。是一个简单的面向消息的传输层,不需要连接。 ​ ● TLS:安全传输层协议(Transport Layer Security)。用于在两个通信应用程序之间提供保密性和数据完整性。 场景介绍 应用通过Socket进行数据传输,支持TCP/UDP/TLS协议。主要场景有: ​ ● 应用通过TCP/UDP Socket进行数据传输 ​ ● 应用通过TLS Socket进行加密数据传输 接口说明 完整的JS API说明以及实例代码请参考:Socket连接。 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支持)。 TLS Socket连接主要由tls_socket模块提供。具体接口说明如下表。 接口名 功能描述 constructTLSSocketInstance() 创建一个TLSSocket对象。 bind() 绑定IP地址和端口号。 close(type: 'error') 关闭连接。 connect() 连接到指定的IP地址和端口。 getCertificate() 返回表示本地证书的对象。 getCipherSuite() 返回包含协商的密码套件信息的列表。 getProtocol() 返回包含当前连接协商的SSL/TLS协议版本的字符串。 getRemoteAddress() 获取TLSSocket连接的对端地址。 getRemoteCertificate() 返回表示对等证书的对象。 getSignatureAlgorithms() 在服务器和客户端之间共享的签名算法列表,按优先级降序排列。 getState() 获取TLSSocket连接的状态。 off(type: 'close') 取消订阅TLSSocket连接的关闭事件。 off(type: 'error') 取消订阅TLSSocket连接的Error事件。 off(type: 'message') 取消订阅TLSSocket连接的接收消息事件。 on(type: 'close') 订阅TLSSocket连接的关闭事件。 on(type: 'error') 订阅TLSSocket连接的Error事件。 on(type: 'message') 订阅TLSSocket连接的接收消息事件。 send() 发送数据。 setExtraOptions() 设置TLSSocket连接的其他属性。 应用TCP/UDP协议进行通信 UDP与TCP流程大体类似,下面以TCP为例: ​ 1. import需要的socket模块。 ​ 2. 创建一个TCPSocket连接,返回一个TCPSocket对象。 ​ 3. (可选)订阅TCPSocket相关的订阅事件。 ​ 4. 绑定IP地址和端口,端口可以指定或由系统随机分配。 ​ 5. 连接到指定的IP地址和端口。 ​ 6. 发送数据。 ​ 7. Socket连接使用完毕后,主动关闭。 import socket from '@ohos.net.socket' // 创建一个TCPSocket连接,返回一个TCPSocket对象。 let tcp = socket.constructTCPSocketInstance(); // 订阅TCPSocket相关的订阅事件 tcp.on('message', value => { console.log("on message") let buffer = value.message let dataView = new DataView(buffer) let str = "" for (let i = 0; i < dataView.byteLength; ++i) { str += String.fromCharCode(dataView.getUint8(i)) } console.log("on connect received:" + str) }); tcp.on('connect', () => { console.log("on connect") }); tcp.on('close', () => { console.log("on close") }); // 绑定IP地址和端口。 let bindAddress = { address: '192.168.xx.xx', port: 1234, // 绑定端口,如1234 family: 1 }; tcp.bind(bindAddress, err => { if (err) { console.log('bind fail'); return; } console.log('bind success'); // 连接到指定的IP地址和端口。 let connectAddress = { address: '192.168.xx.xx', port: 5678, // 连接端口,如5678 family: 1 }; tcp.connect({ address: connectAddress, timeout: 6000 }, err => { if (err) { console.log('connect fail'); return; } console.log('connect success'); // 发送数据 tcp.send({ data: 'Hello, server!' }, err => { if (err) { console.log('send fail'); return; } console.log('send success'); }) }); }); // 连接使用完毕后,主动关闭。取消相关事件的订阅。 setTimeout(() => { tcp.close((err) => { console.log('close socket.') }); tcp.off('message'); tcp.off('connect'); tcp.off('close'); }, 30 * 1000); 应用通过TLS Socket进行加密数据传输 开发步骤 客户端TLS Socket流程: ​ 1. import需要的socket模块。 ​ 2. 绑定服务器IP和端口号。 ​ 3. 双向认证上传客户端CA证书及数字证书;单向认证上传客户端CA证书。 ​ 4. 创建一个TLSSocket连接,返回一个TLSSocket对象。 ​ 5. (可选)订阅TLSSocket相关的订阅事件。 ​ 6. 发送数据。 ​ 7. TLSSocket连接使用完毕后,主动关闭。 import socket from '@ohos.net.socket' // 创建一个(双向认证)TLS Socket连接,返回一个TLS Socket对象。 let tlsTwoWay = socket.constructTLSSocketInstance(); // 订阅TLS Socket相关的订阅事件 tlsTwoWay.on('message', value => { console.log("on message") let buffer = value.message let dataView = new DataView(buffer) let str = "" for (let i = 0; i < dataView.byteLength; ++i) { str += String.fromCharCode(dataView.getUint8(i)) } console.log("on connect received:" + str) }); tlsTwoWay.on('connect', () => { console.log("on connect") }); tlsTwoWay.on('close', () => { console.log("on close") }); // 绑定本地IP地址和端口。 tlsTwoWay.bind({ address: '192.168.xxx.xxx', port: xxxx, family: 1 }, err => { if (err) { console.log('bind fail'); return; } console.log('bind success'); }); // 设置通信过程中使用参数 let options = { ALPNProtocols: ["spdy/1", "http/1.1"], // 连接到指定的IP地址和端口。 address: { address: "192.168.xx.xxx", port: xxxx, // 端口 family: 1, }, // 设置用于通信过程中完成校验的参数。 secureOptions: { key: "xxxx", // 密钥 cert: "xxxx", // 数字证书 ca: ["xxxx"], // CA证书 passwd: "xxxx", // 生成密钥时的密码 protocols: [socket.Protocol.TLSv12], // 通信协议 useRemoteCipherPrefer: true, // 是否优先使用对端密码套件 signatureAlgorithms: "rsa_pss_rsae_sha256:ECDSA+SHA256", // 签名算法 cipherSuite: "AES256-SHA256", // 密码套件 }, }; // 建立连接 tlsTwoWay.connect(options, (err, data) => { console.error(err); console.log(data); }); // 连接使用完毕后,主动关闭。取消相关事件的订阅。 tlsTwoWay.close((err) => { if (err) { console.log("close callback error = " + err); } else { console.log("close success"); } tlsTwoWay.off('message'); tlsTwoWay.off('connect'); tlsTwoWay.off('close'); }); // 创建一个(单向认证)TLS Socket连接,返回一个TLS Socket对象。 let tlsOneWay = socket.constructTLSSocketInstance(); // One way authentication // 订阅TLS Socket相关的订阅事件 tlsTwoWay.on('message', value => { console.log("on message") let buffer = value.message let dataView = new DataView(buffer) let str = "" for (let i = 0;i < dataView.byteLength; ++i) { str += String.fromCharCode(dataView.getUint8(i)) } console.log("on connect received:" + str) }); tlsTwoWay.on('connect', () => { console.log("on connect") }); tlsTwoWay.on('close', () => { console.log("on close") }); // 绑定本地IP地址和端口。 tlsOneWay.bind({ address: '192.168.xxx.xxx', port: xxxx, family: 1 }, err => { if (err) { console.log('bind fail'); return; } console.log('bind success'); }); // 设置通信过程中使用参数 let oneWayOptions = { address: { address: "192.168.xxx.xxx", port: xxxx, family: 1, }, secureOptions: { ca: ["xxxx","xxxx"], // CA证书 cipherSuite: "AES256-SHA256", // 密码套件 }, }; // 建立连接 tlsOneWay.connect(oneWayOptions, (err, data) => { console.error(err); console.log(data); }); // 连接使用完毕后,主动关闭。取消相关事件的订阅。 tlsTwoWay.close((err) => { if (err) { console.log("close callback error = " + err); } else { console.log("close success"); } tlsTwoWay.off('message'); tlsTwoWay.off('connect'); tlsTwoWay.off('close'); }); 本文由博客一文多发平台 OpenWrite 发布!

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。