0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

鸿蒙上实现多人聊天功能

OpenHarmony技术社区 来源:OST开源开发者 2023-01-09 10:03 次阅读

本样例是基于即时通讯(简称 IM)服务实现的 OpenHarmony 应用。

该应用允许两人或多人使用互联网即时地传递文字、图片、文件、语音、emoji 等讯息,可应用于各类聊天场景,为人们带来更加及时高效的通讯体验。

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

设备端:

DAYU200(RK3568)开发板

OpenHarmony 3.1 release 系统

即时通讯实现原理

如下图:

0f8d5868-8f42-11ed-bfe3-dac502259ad0.png

想要实现多个设备之间的无障碍即时通讯,需要多台终端设备、终端应用和服务器配合一起使用。

首先应该将终端应用安装到终端设备上,用户通过应用向服务器申请注册账号。

随后,用户可以通过账号进行查找,添加其他好友,并向好友发送文字、图片、文件、语音、emoji 等讯息。

用户发送的讯息会先送达服务器,由服务器判断其好友的状态(离线/在线),然后选择发送或者暂时缓存消息等操作。

最后,好友的终端应用接收到消息。

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

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

通讯原理:用户在安装了应用的终端设备上编辑信息(文字、图片、文件、语音、emoji 等),通过网络将消息发送至云端服务器。

当对方用户在线时,云端服务器将把消息推送给对方用户,对方用户安装了应用的终端设备也将接收到信息。当对方用户不在线时,信息将被暂时缓存在云端服务器。

4步实现多人即时通讯

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

如下:

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

send():消息发送功能

receive():消息接收功能


//建立TCP连接
if(connect(sock_cli,(structsockaddr*)&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);//清空字符串

②文件消息的发送与接收

0faf7d8a-8f42-11ed-bfe3-dac502259ad0.png

文件转发是即时通讯办公场景下的重要功能。样例中的文件功能支持文件消息的发送、接收和下载。 用户通过点击聊天界面的“+”按钮,选择“文件”按钮,完成本地文件的浏览,随后可以选择是否将文件发送给好友。

这个功能的实现包括三个步骤:

文件的选择

文件上传到服务器

文件的接收

文件上传:

//文件的选择
letfile1={filename:this.$app.$def.uid+'-'+FILE_URL,name:'file',uri:FILE_URL,type:fileType}
letfileId=this.guid();
letdata={};
letheader={"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',functioncallback(headers){
_this.socketSendFile(fileId,timestamp);
});
}).catch((err)=>{
console.error('fileSelect=====Failedtorequesttheupload.Cause:'+JSON.stringify(err));
})
//文件的接收
letdownloadConfig={//下载参数
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',functioncallback(){
prompt.showToast({
message:'下载文件成功!',
duration:1000,
});
});
③语音消息的发送与接收 0fc981bc-8f42-11ed-bfe3-dac502259ad0.png 用户通过点击聊天界面的录制按钮,完成语音的录制,随后可以选择是否将语音发送给好友。

这个功能的实现包括三个步骤:

语音的录制

语音上传到服务器

语音的接收

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

//语音录制
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}casefailed,audiorecorderisnull`)
}
}

//录制好的语音文件的位置
letsrcPath='internal://cache/'+this.mainData.file+'.wav'
letfile1={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',functioncallback(headers){
_this.sendAudio(audioId)
});
uploadTask.on('progress',functioncallback(uploadedSize,totalSize){
console.info("dialogPages=====uploadtotalSize:"+totalSize+"uploadedSize:"+uploadedSize);
});
}).catch((err)=>{
console.error('dialogPages=====Failedtorequesttheupload.Cause:'+JSON.stringify(err));
})
//语音的接收
letdownloadConfig={//下载参数
url:item.content.path,
header:{},
enableMetered:true,
enableRoaming:true,
filePath:filePath,
networkType:request.NETWORK_WIFI
}
letdownloadTask;
let_this=this
request.download(downloadConfig,(err,data)=>{
if(err){
return;
}
downloadTask=data;
//下载完成
downloadTask.on('complete',functioncallback(){
letaudio={
content:{path:filePath}
}
_this.playAudio(audio)
});

④emoji 消息的发送与接收

100142aa-8f42-11ed-bfe3-dac502259ad0.png

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

//引入emoji第三方组件


//第三方组件的展示布局


所有表情

即时通讯功能总结

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

https://gitee.com/isrc_ohos/instant-message_ohos

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

原文标题:鸿蒙上实现多人聊天功能

文章出处:【微信号:gh_834c4b3d87fe,微信公众号:OpenHarmony技术社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    PHP实现简单聊天功能

    php实现简单聊天功能1、创建聊天消息表,其表的字段有消息内容,发送时间和发送者的名称;SQL:CREATE TABLE `guanhui`.`message` ( `id` INT(
    发表于 06-05 15:09

    如何实现HarmonyOS Java端的气泡聊天框?

      HarmonyOSJava端的气泡聊天框怎么实现?android上有9图可实现鸿蒙上有什么类似的方案没?
    发表于 06-13 09:59

    请问一下鸿蒙如何实现分享功能

    , currentScores.getText().toString()));shareIntent = Intent.createChooser(shareIntent, "分享到");startActivity(shareIntent);鸿蒙如何实现类似android
    发表于 06-15 10:37

    请问鸿蒙hap包是否支持插件化开发?

    如题,安卓上可以使用dexclassloader机制动态加载其他apk作为插件使用,鸿蒙上用类似的能力吗?有什么解决方案呢?
    发表于 06-16 11:34

    小程序如何实现聊天功能

    小程序即时聊天功能。 为小程序接入企达小程序IM后,可以实现用户消息即时提醒,当有用户发送消息,会像QQ一样闪烁提醒,并弹窗提示客服人员进行接待,有效避免因接待不及时,而造成用户流失。除了消息提醒,即时
    发表于 03-17 11:13 2239次阅读

    鸿蒙系统有什么新功能

    鸿蒙系统有什么新功能?在前段时间,华为正式发布了鸿蒙系统,鸿蒙系统勾起了许多小伙伴的好奇心,那么应该有很多人好奇
    的头像 发表于 07-06 16:22 6870次阅读

    鸿蒙上使用Python进行物联网编程

    在上一篇帖子《使用 Python 开发鸿蒙设备程序(1-GPIO 外设控制)》中,已经成功的使用 Python 对 GPIO 上的外设进行了控制。 这其实不是什么大不了的事,从功能的角度也着实不值得
    的头像 发表于 09-28 09:55 3733次阅读
    在<b class='flag-5'>鸿蒙上</b>使用Python进行物联网编程

    鸿蒙版微信聊天UI效果实现

      最近开发中要做一个类似微信聊天的工单系统客服中心界面(安卓版)所以想着也模仿一个鸿蒙版(基于 Java UI 的,JS UI 版本的后期更新哈) 那么废话不多数说我们正式开始。     具体实现
    的头像 发表于 11-15 09:35 3236次阅读
    <b class='flag-5'>鸿蒙</b>版微信<b class='flag-5'>聊天</b>UI效果<b class='flag-5'>实现</b>!

    如何在鸿蒙上实现聊天列表滑动删除功能

       本项目基于 ArkUI 中 TS 扩展的声明式开发范式,关于语法和概念直接看官网。    基于 TS 扩展的声明式开发范式 1 : https: / /developer.harmonyos.com/cn /docs/documentation /doc-guides/ui -ts-overview- 00000011 92705715 基于 TS 扩展的声明式开发范式 2 : https: / /developer.harmonyos.com/cn /docs/documentation /doc-references/ts -framework-directory- 00000011115 81264 本文介绍列表滑动删除: 列表中只允许滑出其中一项 如果有打开的项,点击或滑动其他项都会关闭打开的项 点击删除,刷新列表界面
    的头像 发表于 12-03 10:55 2583次阅读

    鸿蒙上安装按钮实现下载、暂停、取消、显示等操作

    今天给大家分享在鸿蒙上一个按钮实现下载、暂停、取消、显示下载进度操作。
    的头像 发表于 01-04 14:32 1847次阅读

    基于openHarmony适配移植的即时聊天功能实现

    项目介绍 项目名称:NettyChat 所属系列:openHarmony的第三方组件适配移植 功能实现了即时聊天功能 项目移植状态:100%,移植完成即时
    发表于 04-12 09:29 5次下载

    鸿蒙上实现“数字华容道”小游戏

    本篇文章教大家如何在鸿蒙上实现“数字华容道”小游戏。
    的头像 发表于 12-26 09:52 873次阅读

    鸿蒙上实现简单的“每日新闻”

    这是一篇讲解如何实现基于鸿蒙 JS 的简单的每日新闻。
    的头像 发表于 12-26 09:58 602次阅读

    鸿蒙上点亮LED灯

    上一篇我们成功的在鸿蒙开发板上输出了 Hello World!这一篇将带大家点亮 LED 灯。
    的头像 发表于 01-16 10:28 1726次阅读

    鸿蒙上开发“小蜜蜂”游戏

    小时候我们有个熟悉的游戏叫小蜜蜂。本文教大家在鸿蒙上学做这个小蜜蜂游戏。
    的头像 发表于 04-03 11:27 1251次阅读