前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >玩转OpenHarmony社交场景:即时通讯平台

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

原创
作者头像
小帅聊鸿蒙
发布于 2025-04-26 07:56:28
发布于 2025-04-26 07:56:28
15400
代码可运行
举报
文章被收录于专栏:鸿蒙开发笔记鸿蒙开发笔记
运行总次数:0
代码可运行

 一、简介

本样例是基于即时通讯(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():消息接收功能;

代码语言:c
代码运行次数:0
运行
AI代码解释
复制
//建立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)文件的接收。

• 文件上传

代码语言:c
代码运行次数:0
运行
AI代码解释
复制
//文件的选择
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)语音的接收。

DD一下:欢迎大家关注工粽号<程序猿百晓生>,可以了解到以下知识点。
代码语言:erlang
AI代码解释
复制
`欢迎大家关注工粽号<程序猿百晓生>,可以了解到以下知识点。`
1.OpenHarmony开发基础
2.OpenHarmony北向开发环境搭建
3.鸿蒙南向开发环境的搭建
4.鸿蒙生态应用开发白皮书V2.0 & V3.0
5.鸿蒙开发面试真题(含参考答案) 
6.TypeScript入门学习手册
7.OpenHarmony 经典面试题(含参考答案)
8.OpenHarmony设备开发入门【最新版】
9.沉浸式剖析OpenHarmony源代码
10.系统定制指南
11.OpenHarmonyUboot 驱动加载流程
12.OpenHarmony构建系统--GN与子系统、部件、模块详解
13.ohos开机init启动流程
14.鸿蒙版性能优化指南
.......

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

代码语言:c
代码运行次数:0
运行
AI代码解释
复制
//语音录制
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,随后可以选择具体样式并将其发送给好友。

代码语言:c
代码运行次数:0
运行
AI代码解释
复制
//引入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等讯息的快速发送与接收。除此之外还实现了好友的添加与删除、黑名单、安全登录、私聊/群聊、个人信息设置(二维码/头像等)等功能的全方面支持。

写在最后

如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:

  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力;
  • 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识;
  • 想要获取更多完整鸿蒙最新学习知识点,可关注B站:码牛课堂;

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
玩转OpenHarmony社交场景:即时通讯平台
本样例是基于即时通讯(Instant messaging,简称IM)服务实现的OpenAtom OpenHarmony(简称“OpenHarmony”)应用,允许两人或多人使用互联网即时地传递文字、图片、文件、语音、emoji等讯息,可应用于各类聊天场景,为人们带来更加及时高效的通讯体验。
小帅聊鸿蒙
2024/09/10
1740
玩转OpenHarmony社交场景:即时通讯平台
OpenHarmony如何正确利用native的方式实现跨线程调用?
在OpenHarmony应用开发实践中,经常会遇到一些耗时的任务,如I/O操作、域名解析以及复杂计算等。这些任务如果直接在主线程中执行,将会严重阻塞主线程,影响后续任务的正常流程,进而导致用户界面响应延迟甚至卡顿。因此,为了提升代码性能,通常会将这类耗时任务放在子线程中执行。
小帅聊鸿蒙
2024/10/15
4050
OpenHarmony如何正确利用native的方式实现跨线程调用?
这套分布式IM即时通讯系统如何写到简历上?我给你整理好了!
分布式IM即时通讯系统本质上就是对线上聊天和用户的管理,针对聊天本身来说,最核心的需求就是:发送文字、图片、文件、语音、视频、消息缓存、消息存储、消息未读、已读、撤回,离线消息、历史消息、单聊、群聊,多端同步,以及其他一些需求。
冰河
2023/12/12
6520
这套分布式IM即时通讯系统如何写到简历上?我给你整理好了!
IM即时通讯实现原理
即时通讯(Instant Messenger,简称IM)软件多是基于TCP/IP和UDP进行通讯的,TCP/IP和UDP都是建立在更低层的IP协议上的两种通讯传输协议。前 者是以数据流的形式,将传输数据经分割、打包后,通过两台机器之间建立起的虚电路,进行连续的、双向的、严格保证数据正确性的文件传输协议。而后者是以数 据报的形式,对拆分后的数据的先后到达顺序不做要求的文件传输协议。 QQ就是使用UDP协议进行发送和接收消息的。当你的机器安装了OICQ以后,实际上,你既是服务端(Server),又是客户端(C
李海彬
2018/03/22
7.8K0
IM即时通讯实现原理
即时通讯(Instant Messenger,简称IM)软件多是基于TCP/IP和UDP进行通讯的,TCP/IP和UDP都是建立在更低层的IP协议上的两种通讯传输协议。前 者是以数据流的形式,将传输数据经分割、打包后,通过两台机器之间建立起的虚电路,进行连续的、双向的、严格保证数据正确性的文件传输协议。而后者是以数 据报的形式,对拆分后的数据的先后到达顺序不做要求的文件传输协议。
V13144630810
2021/01/26
2.3K0
IM即时通讯实现原理
一文教你用java实现即时通讯软件的设计(附下载源码)
随着信息社会的快速发展,网络作为改变世界的最重要的因素。众多的企业纷纷使用局域网聊天来满足工作与交流高效、快速执行的需求。企业中使用内部局域网可以使内部信息交互的过程得以简化,从而达到提高工作效率的目的。所以经上所述,公司内部使用即时通讯的方式在各台计算机之间进行交流已经是时代发展的趋势。
孙叫兽
2021/03/23
1.1K0
HarmonyOS 开发实践——跨语言的复杂参数类型传递
我们经常在ArkTS与C++之间相互传递参数,那么具体该如何传呢?下面介绍了几个常用的场景:
小帅聊鸿蒙
2024/11/10
3070
HarmonyOS 开发实践——跨语言的复杂参数类型传递
即时通讯开发系统的介绍
由于即时通讯系统的复杂性和对服务器稳定性的很高要求,一般即时通讯系统开发至少需要1年左右的时间,而这还只是测试版,离"稳定"还有一定距离,而这时匆匆上马的不稳定的系统会让你失去用户,您也不可能召集上万台电脑进行测试,那样的成本本身已经相当高,而无论如何测试,也仍然只是测试系统。而我们的系统,是经过几年的正式使用,经受过实际高用户量稳定运行的系统。这是长时间专业积累的经验和成果。所以,需要选择与专业的音视频即时通讯开发公司合作,可以快速获得即时通讯的开发经验和一套稳定的系统。
用户8119822
2021/02/03
1.6K0
iOS 即时通讯 + 仿微信聊天框架 + 源码
更新:2017年8月1日 实在是抱歉,git上的Demo这么久,有问题自己没有发现!肯定给大家造成过不方便,抱歉!git上Demo刚重新上传,要有需要的可以去下载,要有问题可以直接找我QQ联系我!       最近在总结Socket方面的知识,等文章写完会发不来,这篇文章是去年什么四五月份写的吧,那是水平也是有限,希望接下来能总结的比这篇好一点!!       在Demo中,XMPP接收发送消息这一块的代码我暂时是删除了,仿照微信的聊天框架是在的,你要想通过XMPP自己在项目中试试,你需要的也就是在Dem
Mr.RisingSun
2018/02/06
4.1K0
iOS  即时通讯 + 仿微信聊天框架 + 源码
端开发技术——FLutter开发即时通讯
即时通讯是端开发工作中常见的需求,本篇文章以作者工作中使用FLutter开发社交软件即时通讯需求为背景,描述一下即时通讯功能设计的要点。
思想者杰克
2021/11/04
2K0
laravel实现利用RabbitMQ实现MQTT即时通讯
有时候我们的项目中会用到即时通讯功能,比如电商系统中的客服聊天功能,还有在支付过程中,当用户支付成功后,第三方支付服务会回调我们的回调接口,此时我们需要通知前端支付成功。而 RabbitMQ 可以很方便的实现即时通讯功能,如果你的业务只是少量地方使用即时通信,需要一个简易的消息系统,你可以直接考虑 MQ 的实现, MQ 有很高的吞吐率,具有持久化,还可以横向扩展,总之还不错,用就完了,奥利给!
憧憬博客
2021/01/03
4.2K0
laravel实现利用RabbitMQ实现MQTT即时通讯
推荐一个鸿蒙即时通讯软件《果聊》,有点屌呢!!
首先可以来看一下我实现之后在DAYU200的运行效果,建议大家一键三连,支持一下坚果,毕竟坚果也不容易。
徐建国
2022/12/05
8170
推荐一个鸿蒙即时通讯软件《果聊》,有点屌呢!!
RabbitMQ实现即时通讯居然如此简单!连后端代码都省得写了?
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的轻量级通讯协议,该协议构建于TCP/IP协议上。MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。
macrozheng
2020/10/28
2.4K0
RabbitMQ实现即时通讯居然如此简单!连后端代码都省得写了?
优雅草蜻蜓I即时通讯软件以及优雅草蜻蜓I即时通讯水银版私有化部署软件介绍和区别-优雅草卓伊凡
优雅草蜻蜓I即时通讯软件以及优雅草蜻蜓I即时通讯水银版私有化部署软件介绍和区别-优雅草卓伊凡
卓伊凡
2025/06/16
790
深入浅出即时通讯(1)_即时通讯协议对比
业界上用来做即时通讯的解决方案有:1. 基于http 的轮询; 2. 基于websocket 长连接; 3. 基于tcp或udp的自定义协议, 这种若在要在Web端使用, 需要套一层websocket 封装. 此外早期还有基于Comet 技术的长连接,基于xmpp 的开源客户端应用等。
E聊SDK
2022/05/17
3.3K0
开源即时通讯(IM)项目OpenIM源码部署流程
由于OpenIM依赖的组件较多,开发者需求不一,导致OpenIM部署一直被人诟病,经过几次迭代优化,包括依赖的组件compose的一键部署,环境变量设置一次,全局生效,以及脚本重构,目前OpenIM部署比较丝滑,特写文章分享给大家。
OpenIM
2023/09/12
2.7K0
PHP/Java即时通讯源码下载 - 开源IM系统开发指南与定制服务
在数字化时代,即时通讯(Instant Messaging, IM)已成为互联网应用的核心基础设施之一。从早期的ICQ、QQ到如今的微信、Slack,即时通讯技术经历了从简单文本消息到富媒体交互、从单端应用到多端协同的演进。随着移动互联网、云计算和跨平台开发技术的成熟,用户对即时通讯的需求已不再局限于单一设备,而是要求在手机APP、Web浏览器、PC客户端等多种终端之间实现无缝的实时通讯体验。
用户7417571
2025/06/19
940
PHP/Java即时通讯源码下载 - 开源IM系统开发指南与定制服务
[开源] 即时通讯组件---ImCore
ImCore 是一款 .NETCore 下利用 WebSocket 实现的简易、高性能、集群即时通讯组件,支持点对点通讯、群聊通讯、上线下线事件消息等众多实用性功能。
梁规晓
2019/08/01
7.3K1
[开源] 即时通讯组件---ImCore
基于Netty实现的即时通讯
Jelly是一款基于Netty4.x开发的TCP长连接即时通讯服务器端程序;并且提供了Java客户端API。
BUG弄潮儿
2022/06/30
8200
uniapp使用WebSocket实现即时通讯
WebSocket是一种基于TCP协议的全双工通信协议,它可以在客户端和服务器之间建立一个持久性的连接,实现实时通信。在uniapp中,我们可以使用uni-socketio插件来实现WebSocket的功能。
超级小可爱
2023/10/18
4.5K0
推荐阅读
相关推荐
玩转OpenHarmony社交场景:即时通讯平台
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验