玩转OpenHarmony社交场景:即时通讯平台

OpenHarmony实战开发-如何实现聊天实例应用。 这是一个仿聊天类应用,使用了静态布局搭建了不同的页面。为了优化内存与性能体验,在部分list场景使用了懒加载。 阅读详情

目录

一、简介

二、即时通讯实现原理

三、4步实现多人即时通讯

四、即时通讯功能总结

五、相关参考链接


一、简介

本样例是基于即时通讯(Instant messaging,简称IM)服务实现的OpenAtom OpenHarmony(简称“OpenHarmony”)应用,允许两人或多人使用互联网即时地传递文字、图片、文件、语音、emoji等讯息,可应用于各类聊天场景,为人们带来更加及时高效的通讯体验。

此外即时通讯平台具备较高的定制化特点,适用于多种行业,客户可以根据自己的需求来定制,实现即时通讯的内部私有化。

设备端:DAYU200(RK3568)开发板,OpenHarmony 3.1 release系统。

二、即时通讯实现原理

想要实现多个设备之间的无障碍即时通讯,需要多台终端设备、终端应用和服务器配合一起使用。首先应该将终端应用安装到终端设备上,用户通过应用向服务器申请注册账号。随后,用户可以通过账号进行查找,添加其他好友,并向好友发送文字、图片、文件、语音、emoji等讯息。用户发送的讯息会先送达服务器,由服务器判断其好友的状态(离线/在线),然后选择发送或者暂时缓存消息等操作。最后,好友的终端应用接收到消息。

实现即时通讯的设备需求:安装应用的终端设备、网络环境和云端服务器。

前提条件:用户将应用安装在终端设备上,并且拥有注册账号,且需要通讯的用户也成功注册了账号并且添加了好友。

通讯原理:用户在安装了应用的终端设备上编辑信息(文字、图片、文件、语音、emoji等),通过网络将消息发送至云端服务器。当对方用户在线时,云端服务器将把消息推送给对方用户,对方用户安装了应用的终端设备也将接收到信息。当对方用户不在线时,信息将被暂时缓存在云端服务器。

三、4步实现多人即时通讯

(1) 通讯功能通讯功能是通过TCP协议实现的,我们将通讯接口connect()、send()、receive()的实现放置在CPP文件中,通过NAPI的方式对JS层暴露接口。

• connect():客户端和服务器建立连接;

• send():消息发送功能

• receive():消息接收功能;

//建立TCP连接
if (connect(sock_cli, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {
    napi_create_int32(env, 0, &result);
} else {
    napi_create_int32(env, 1, &result);
    OH_LOG_INFO(LOG_APP,"C++ 接收线程启动");
    startRec();
}
 //发送消息
if(send(sock_cli, data, strlen(data),0) == -1) {
    OH_LOG_INFO(LOG_APP,"zjf == send() : -1");
    napi_create_int32(env, 0, &result);
} else {
    OH_LOG_INFO(LOG_APP,"zjf == send() : !-1");
    napi_create_int32(env, 1, &result);
}
//接收消息
getStep(queue0,sharedMessage); //取出一条消息
const char *c_s=sharedMessage.c_str();//换为char*形式处理
napi_value result;
napi_create_string_utf8(env, c_s, sharedMessage.length(), &result);
std::string().swap(sharedMessage);//清空字符串

(2) 文件消息的发送与接收

文件转发是即时通讯办公场景下的重要功能。样例中的文件功能支持文件消息的发送、接收和下载。用户通过点击聊天界面的“+”按钮,选择“文件”按钮,完成本地文件的浏览,随后可以选择是否将文件发送给好友。这个功能的实现包括三个步骤:(1)文件的选择;(2)文件上传到服务器;(3)文件的接收。

• 文件上传

//文件的选择
let file1 = {filename: this.$app.$def.uid +'-'+ FILE_URL, name: 'file', uri: FILE_URL, type:fileType }
let fileId = this.guid();
let data = {};
let header = { "filename": this.selectedFileName.toString()};
//文件上传到服务器
request.upload({ url: "http://" + this.$app.$def.ip +"/file/fileUpload?fileSignature=" + fileId + "&uid=" +this.$app.$def.uid + "&fileType=" +this.$app.$def.chatData[this.idx].unRead, header: header, method: "POST", files: [file1], data: [data] }).then((data) => {
  uploadTask = data;
  uploadTask.on('headerReceive', function callback(headers){
  _this.socketSendFile(fileId, timestamp);
  });
}).catch((err) => {
  console.error('fileSelect=====Failed to request the upload. Cause: ' + JSON.stringify(err));
})
//文件的接收
let downloadConfig = {  //下载参数
            url: fileUrl, 
            header: {}, 
            enableMetered: true, 
            enableRoaming: true,
            filePath: '/data/storage/el2/base/haps/entry/files/' + downloadFileName,
            networkType: request.NETWORK_WIFI
}
request.download(downloadConfig, (err, data) => {
        if (err) {
            return;
        }
        downloadTask = data;
        //下载完成
        downloadTask.on('complete', function callback() {
                prompt.showToast({
                   message: '下载文件成功!',
                   duration: 1000,
                });
        });

(3) 语音消息的发送与接收

 用户通过点击聊天界面的录制按钮,完成语音的录制,随后可以选择是否将语音发送给好友。这个功能的实现包括三个步骤:(1)语音的录制;(2)语音上传到服务器;(3)语音的接收。

图片消息的发送与语音消息的发送步骤相同,文章中不再赘述。

//语音录制
startRecorder(config, callback) {
    if (typeof (this.audioRecorder) !== 'undefined') {
        this.audioRecorder.on('prepare', () => {
        this.audioRecorder.start()
    })
        this.audioRecorder.on('start', () => {
            callback()
        })
        this.audioRecorder.prepare(config)
     } else {
        logger.info(`${TAG} case failed, audiorecorder is null`)
    }
}

//录制好的语音文件的位置
let srcPath = 'internal://cache/' + this.mainData.file + '.wav'
let file1 = { filename: this.$app.$def.uid +'-'+ this.mainData.path, name: 'audio', uri: srcPath, type: "wav" };

//语音消息发送到服务器
request.upload({ url: myurl, header: header, method: "POST", files: [file1], data: [data] }).then((data) => {
            uploadTask = data;
            uploadTask.on('headerReceive', function callback(headers){
              _this.sendAudio(audioId)
            });
            uploadTask.on('progress', function callback(uploadedSize, totalSize) {
                console.info("dialogPages=====upload totalSize:" + totalSize + "  uploadedSize:" + uploadedSize);
            });
        }).catch((err) => {
            console.error('dialogPages=====Failed to request the upload. Cause: ' + JSON.stringify(err));
        })
//语音的接收
let downloadConfig = {    //下载参数
        url: item.content.path,
        header: {},  
        enableMetered: true,                      
        enableRoaming: true,                      
        filePath: filePath,               
        networkType: request.NETWORK_WIFI        
}
        let downloadTask;
        let _this = this
        request.download(downloadConfig, (err, data) => {
            if (err) {
                 return;
            }
            downloadTask = data;
            //下载完成
            downloadTask.on('complete', function callback() {
               let audio = {
                  content: { path: filePath }
                 }
                 _this.playAudio(audio)
            });

(4) emoji消息的发送与接收

emoji是即时通讯软件不可缺少的一部分,可以更加生动地表现用户的聊天情感。在样例中,用户通过点击聊天界面的emoji按钮,即可找到目前应用内支持的所有样式的emoji,随后可以选择具体样式并将其发送给好友。

//引入emoji第三方组件
<element name="emojiExpression" src="../../common/components/emojiExpression/emojiExpression.hml"></element>

//第三方组件的展示布局
<div id="moreContainer" if="{{showFace}}">
    <div id="moreOneLine">
        <div class="moreFillGap" style="flex: 1 1;"></div>
        <text style="left: 25fp; top: 10fp;">所有表情</text>
        <emojiExpression></emojiExpression>
        <div class="moreFillGap" style="flex: 1 1;"></div>
    </div>
</div>

四、即时通讯功能总结

本样例是基于OpenHarmony实现的即时通讯应用,目前已经支持文字、图片、文件、语音、emoji等讯息的快速发送与接收。除此之外还实现了好友的添加与删除、黑名单、安全登录、私聊/群聊、个人信息设置(二维码/头像等)等功能的全方面支持。

代码地址InstantMessage_ohos: 基于Socket的即时通讯工具

五、相关参考链接

样例源码InstantMessage_ohos: 基于Socket的即时通讯工具

OpenHarmony知识体系工作组knowledge: 为OpenHarmony社区共建学习路径,开发样例,三方库,深度文章,直播课程,素材拓展等内容,并依托OpenHarmony官网呈现给开发者,帮助开发者快速查找学习资源,共同繁荣OpenHarmony社区。

【鸿蒙南向开发】—— 玩转OpenHarmony社交场景:即时通讯平台 本样例是基于即时通讯(Instant messaging,简称IM)服务实现的OpenAtom OpenHarmony(简称“OpenHarmony”)应用,允许两人或多人使用互联网即时地传递文字、图片、文件、语音、emoji等讯息,可应用于各类聊天场景,为人们带来更加及时高效的通讯体验。此外即时通讯平台具备较高的定制化特点,适用于多种行业,客户可以根据自己的需求来定制,实现即时通讯的内部私有化。设备端:DAYU200(RK3568)开发板,OpenHarmony 3.1 release系统。 阅读详情

相关推荐

【鸿蒙实战开发】一多开发实例(即时通讯)

本文从目前流行的垂类市场中,选择即时通讯应用作为典型案例详细介绍 “一多” 在实际开发中的应用。一多即时通讯应用的核心功能为用户交互,主要包含对话聊天、通讯录,社交圈等交互功能。开发者在开发"一多"应用时,经常会遇见多端适配上的问题,本文选择了即时通讯应用的一个常见问题,提供了推荐的解决方案,开发者在"一多"开发中遇见同类问题时可以快速解决。聊天场景如何进行布局设计。

shangkangba的博客 1133

OpenHarmony实现聊天UI-创建tab页面

创建tab页面

移动端开发 409

OpenHarmony使用Socket实现一个TCP服务端详解

使用Socket实现一个TCP的服务端,详解内容方法作用和实现原理

Halifax 1534

OpenHarmony 网络管理-Socket连接

本示例主要演示了Socket在网络通信方面的应用,展示了Socket在两端设备的连接验证、聊天通信方面的应用。

1 1752

机器人C++开源库The Robotics Library (RL)使用手册(三)

进入VS工程,我们先看看这些功能函数及其依赖库的分布关系:rl命名空间下,主要有八大模块。搞定VS后将逐个拆解。

qq_34839823的博客 1736

Zabbix安装与部署 系统环境:centos7.0

Zabbix安装与部署 系统环境:centos7.0

weixin_42485027的博客 2600

Flutter for OpenHarmony: Flutter 三方库 flutter_chat_types 构建鸿蒙端标准化即时通讯数据模型(IM 开发基石)

本文介绍了flutter_chat_types库在OpenHarmony即时通讯应用开发中的应用。该库提供了一套标准化的消息对象模型,包括文本、图片、文件等消息类型,支持消息状态管理和JSON序列化。文章通过示例代码展示了如何创建用户和消息、管理消息状态流转,以及处理消息列表。该库不包含UI逻辑,专注于业务模型,适合构建高性能的鸿蒙IM应用,并能很好地适配鸿蒙的多设备协同场景。通过使用这套经过验证的消息模型,开发者可以快速搭建专业级的即时通讯应用底层架构。

cannonjinx的博客 3169

保姆级教程:用Simulink从零搭建新能源汽车VCU蠕行控制模型(附模型下载)

本文提供了一份详细的Simulink建模教程,指导读者从零开始搭建新能源汽车VCU蠕行控制模型。内容涵盖环境配置、信号定义、蠕行模式使能条件、扭矩控制算法实现及模型验证等关键步骤,特别适合需要将控制算法转化为可执行模型的初学者。教程还包含实用代码示例和常见问题解决方案,帮助开发者快速掌握VCU蠕行控制的Simulink实现技巧。

545

Flutter 三方库 flutter_chat_ui 的鸿蒙化适配指南 - 掌握标准化的即时通讯 UI 构建技术、助力鸿蒙社交应用实现极致流畅且高度专业的对话交互体系

在 OpenHarmony 鸿蒙应用全场景覆盖、特别是适配“即时通讯(IM)、在线客服系统、社区互动平台”等高频交互场景中,聊天界面的质感直接决定了用户的活跃度与留存率。一个成熟的聊天 UI 需要处理海量消息的平滑滚动、消息气泡的高低自适应、多种多媒体附件的预览以及极度复杂的键盘交互。如何从零构建这样一个工业级的界面?作为一个专注于“通过声明式声明快速产出专业级聊天 UI”的库,旨在为鸿蒙开发者提供一套标准的 IM 界面解决方案。本文将详述其在鸿蒙端的实战技法。的核心逻辑是。

cannonjinx的博客 1536

解锁医疗AI密码:医疗人工智能专业大学四年学习路径

医疗AI人才培养路径解析 本文系统梳理了医疗人工智能专业四年培养方案,分为基础、进阶、应用和拓展四个阶段: 大一聚焦基础学科,涵盖高等数学、医学概论、Python编程等核心课程,辅以医学数据认知实习。大二深入机器学习和医学数据处理领域,学习监督/无监督学习算法及医学影像分析技术。大三进入深度学习阶段,掌握CNN/RNN等神经网络模型,并实践医疗AI应用开发。大四关注前沿技术如大模型在医疗中的应用,完成毕业设计与企业实习。 课程体系强调医工交叉,每学期均配置实践环节,从基础编程到参与真实医疗AI项目,逐步培养

AllenLV的博客 2499

人工智能训练师三级考试备考全攻略|报名条件+真题+补贴申领一站式通关(2026版)

本专栏是人工智能训练师三级考证最完整的备考指南,共77篇文章,覆盖从职业认知、报名实操、AI基础知识、数据标注、模型训练测试部署、考前冲刺到考后进阶的全链路。本导读按模块整理了全部文章链接,帮你快速定位所需内容。人工智能训练师是国家认定的正式职业,证书可在osta.mohrss.gov.cn查询,三级证书可申领最高3120元技能补贴。

白话机器学习 1790

Flutter & OpenHarmony 社交App消息已读回执组件构建方案

本文介绍了在Flutter和OpenHarmony平台上实现消息已读回执组件的完整方案。Flutter版本通过MessageStatus枚举定义五种消息状态,使用Row和条件渲染显示状态图标及已读人数统计。OpenHarmony ArkTS实现采用类似逻辑,通过@Builder构建不同状态图标。两种平台均支持单聊/群聊场景,提供直观的视觉反馈(如蓝色双勾表示已读),并实现了群聊已读详情弹窗功能,有效提升了即时通讯应用的用户体验。

ttt1_的博客 364

TIA博途WINCC的触摸屏VB脚本入门指南(嵌入式)

通过编写事件处理程序,您可以响应触摸屏元素的各种事件,并实现自定义的功能。本文将为您提供TIA博途WINCC触摸屏VB脚本的入门指南,帮助您了解基本的脚本编写和嵌入式开发。假设我们有一个名为"Button1"的按钮元素,当用户点击该按钮时,触发相应的事件处理程序,并在触摸屏上显示一条消息。然后回到触摸屏界面编辑器,在按钮元素的属性窗口中找到"按下"事件,并选择刚才创建的脚本文件作为事件处理程序。现在,当用户点击按钮时,触摸屏将执行相应的事件处理程序,并显示一条消息框,内容为"按钮被点击了!

CodeSageX的博客 4416

Flutter for OpenHarmony: Flutter 三方库 profanity_filter 打造更纯净的鸿蒙应用社交环境(违禁词过滤神器)

在 OpenHarmony 社交、评论、直播等涉及用户内容产出(UGC)的应用中,违禁词过滤(Profanity Filtering)是满足合规性、提升社区氛围的刚需。如果让开发者手动去维护成千上万个敏感词的正则是极其不理智的。提供了一个极其轻量、高效且易于扩展的过滤引擎。它不仅能快速检测字符串中是否存在违禁内容,还能一键完成内容的净化与打码。默认库可能无法涵盖鸿蒙特定业务场景。// 💡 创建时传入白名单和黑名单'自定义违禁词1','自定义违禁词2',]);

好代码自己会说话,烂代码才需要注释来圆谎 5683

(五)深入理解蓝牙BLE之“Beacon包格式详解”

蓝牙Beacon格式详解 本文重点在结合Bluetooth官网spec和几个例子来使beacon帧格式更加容易被理解。 广播帧格式: 首先beacon是蓝牙BLE广播包的一种,蓝牙广播帧格式如下: PS:其实BLE数据帧除了报头字段和数据字段定义与广播帧不同之外,前导/接入地址/长度/校验格式均相同。 广播帧数据字段格式: 数据字段最长为37个字节:6个字节的广播设备地址 + 31个字节广播数据。 广播数据的格式如下:AD Structure1 +AD Structure2 + .....

1万+

QT西游回合制源码+java后台管理系统

这是一套回合制游戏源码,很适合学习。

renkai721的专栏 2536

Flutter 三方库 emojis 鸿蒙多元场景交互级适配指南:深度对接原生生态文字排版引擎与跨终端统一视觉呈现解析系统、赋能超级社交应用高能度全量字符集无损-适配鸿蒙 HarmonyOS ohos

随着鸿蒙操作系统在全球范围内的推广,支持各种多态、富文本的表情输入已成为社交应用的标配。不同于简单的字符拼贴,emojis库提供了包含名称、简码(Shortcodes)及类别的深度数据支持。在鸿蒙这个强调极简美学和流畅交互的系统中,如何构建一个高性能且美观的表情选择器,是提升用户黏性的关键细节。回顾核心知识点,并提供后续进阶方向。emojis库以其简洁的数据结构,为鸿蒙应用的交互体验增加了“情感的色彩”。在追求功能完整性的同时,合理利用这些细微的表达工具,能让应用显得更加人性化和国际化。

Leo 4288

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

React Native for OpenHarmony 实战:Avatar 头像组件详解

Avatar(头像)组件是UI设计中用于表示用户身份的视觉元素,通常以圆形或方形图像呈现。在React Native生态系统中,Avatar组件并非官方核心组件,而是通过社区库或自定义实现的方式提供。显示用户头像图片支持默认占位符(当图片加载失败或用户未设置头像时)支持圆形、方形等不同形状支持边框、状态指示器等装饰元素支持点击交互本文详细探讨了React Native在OpenHarmony平台上实现Avatar头像组件的各种技术方案。

Abin 712

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

React Native for OpenHarmony 实战:封装多功能的 Avatar 头像组件

本文详细介绍了如何封装一个功能完善的Avatar头像组件,主要涵盖六大使用场景:显示用户头像图片、用户名首字母、不同尺寸和形状、状态徽章以及头像组。通过分析需求设计了组件接口,包括source、name、size、shape等属性,并实现了尺寸计算、首字母提取、形状处理等核心逻辑。组件采用条件渲染策略,支持图片和文字两种显示模式,同时通过外层相对定位实现徽章功能。该设计兼顾了灵活性和易用性,适用于各种应用场景的头像展示需求。

2501_93999581的博客 628

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

上一篇: 玩转OpenHarmony智能家居:如何实现树莓派“碰一碰”设备控制
下一篇: OpenHarmony系统使用gdb调试init
OpenHarmony开发者
博客等级 码龄5年 625粉丝 221原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值