鸿蒙上实现多人聊天功能
本样例是基于即时通讯(简称IM)服务实现的OpenHarmony应用。
该应用允许两人或多人使用互联网即时地传递文字、图片、文件、语音、emoji等讯息,可应用于各类聊天场景,为人们带来更加及时高效的通讯体验。
此外即时通讯平台具备较高的定制化特点,适用于多种行业,客户可以根据自己的需求来定制,实现即时通讯的内部私有化。
设备端:DAYU200(RK3568)开发板OpenHarmony3。1release系统
即时通讯实现原理
如下图:
想要实现多个设备之间的无障碍即时通讯,需要多台终端设备、终端应用和服务器配合一起使用。
首先应该将终端应用安装到终端设备上,用户通过应用向服务器申请注册账号。
随后,用户可以通过账号进行查找,添加其他好友,并向好友发送文字、图片、文件、语音、emoji等讯息。
用户发送的讯息会先送达服务器,由服务器判断其好友的状态(离线在线),然后选择发送或者暂时缓存消息等操作。
最后,好友的终端应用接收到消息。
实现即时通讯的设备需求:安装应用的终端设备、网络环境和云端服务器。
前提条件:用户将应用安装在终端设备上,并且拥有注册账号,且需要通讯的用户也成功注册了账号并且添加了好友。
通讯原理:用户在安装了应用的终端设备上编辑信息(文字、图片、文件、语音、emoji等),通过网络将消息发送至云端服务器。
当对方用户在线时,云端服务器将把消息推送给对方用户,对方用户安装了应用的终端设备也将接收到信息。当对方用户不在线时,信息将被暂时缓存在云端服务器。
4步实现多人即时通讯
通讯功能是通过TCP协议实现的,我们将通讯接口connect()、send()、receive()的实现放置在CPP文件中,通过NAPI的方式对JS层暴露接口。
如下:connect():客户端和服务器建立连接send():消息发送功能receive():消息接收功能建立TCP连接if(connect(sockcli,(structsockaddr)servaddr,sizeof(servaddr))0){napicreateint32(env,0,result);}else{napicreateint32(env,1,result);OHLOGINFO(LOGAPP,C接收线程启动);startRec();}发送消息if(send(sockcli,data,strlen(data),0)1){OHLOGINFO(LOGAPP,zjfsend():1);napicreateint32(env,0,result);}else{OHLOGINFO(LOGAPP,zjfsend():!1);napicreateint32(env,1,result);}接收消息getStep(queue0,sharedMessage);取出一条消息constcharcssharedMessage。cstr();换为char形式处理napivalueresult;napicreatestringutf8(env,cs,sharedMessage。length(),result);std::string()。swap(sharedMessage);清空字符串文件消息的发送与接收
文件消息的发送与接收
文件转发是即时通讯办公场景下的重要功能。样例中的文件功能支持文件消息的发送、接收和下载。
用户通过点击聊天界面的按钮,选择文件按钮,完成本地文件的浏览,随后可以选择是否将文件发送给好友。
这个功能的实现包括三个步骤:文件的选择文件上传到服务器文件的接收
文件上传:文件的选择letfile1{filename:this。app。def。uidFILEURL,name:file,uri:FILEURL,type:fileType}letfileIdthis。guid();letdata{};letheader{filename:this。selectedFileName。toString()};文件上传到服务器request。upload({url:http:this。app。def。ipfilefileUpload?fileSignaturefileIduidthis。app。def。uidfileTypethis。app。def。chatData〔this。idx〕。unRead,header:header,method:POST,files:〔file1〕,data:〔data〕})。then((data){uploadTaskdata;uploadTask。on(headerReceive,functioncallback(headers){this。socketSendFile(fileId,timestamp);});})。catch((err){console。error(fileSelectFailedtorequesttheupload。Cause:JSON。stringify(err));})文件的接收letdownloadConfig{下载参数url:fileUrl,header:{},enableMetered:true,enableRoaming:true,filePath:datastorageel2basehapsentryfilesdownloadFileName,networkType:request。NETWORKWIFI}request。download(downloadConfig,(err,data){if(err){return;}downloadTaskdata;下载完成downloadTask。on(complete,functioncallback(){prompt。showToast({message:下载文件成功!,duration:1000,});});
语音消息的发送与接收
用户通过点击聊天界面的录制按钮,完成语音的录制,随后可以选择是否将语音发送给好友。
这个功能的实现包括三个步骤:语音的录制语音上传到服务器语音的接收
图片消息的发送与语音消息的发送步骤相同,文章中不再赘述。语音录制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)}}录制好的语音文件的位置letsrcPathinternal:cachethis。mainData。file。wavletfile1{filename:this。app。def。uidthis。mainData。path,name:audio,uri:srcPath,type:wav};语音消息发送到服务器request。upload({url:myurl,header:header,method:POST,files:〔file1〕,data:〔data〕})。then((data){uploadTaskdata;uploadTask。on(headerReceive,functioncallback(headers){this。sendAudio(audioId)});uploadTask。on(progress,functioncallback(uploadedSize,totalSize){console。info(dialogPagesuploadtotalSize:totalSizeuploadedSize:uploadedSize);});})。catch((err){console。error(dialogPagesFailedtorequesttheupload。Cause:JSON。stringify(err));})语音的接收letdownloadConfig{下载参数url:item。content。path,header:{},enableMetered:true,enableRoaming:true,filePath:filePath,networkType:request。NETWORKWIFI}letdownloadTask;letthisthisrequest。download(downloadConfig,(err,data){if(err){return;}downloadTaskdata;下载完成downloadTask。on(complete,functioncallback(){letaudio{content:{path:filePath}}this。playAudio(audio)});
emoji消息的发送与接收
emoji是即时通讯软件不可缺少的一部分,可以更加生动地表现用户的聊天情感。
在样例中,用户通过点击聊天界面的emoji按钮,即可找到目前应用内支持的所有样式的emoji,随后可以选择具体样式并将其发送给好友。引入emoji第三方组件elementnameemojiExpressionsrca2020imgdataimg。jpgdatasrc。。。。commoncomponentsemojiExpressionemojiExpression。hmlelement第三方组件的展示布局textstyleleft:25fp;top:10fp;所有表情textemojiExpressionemojiExpression
即时通讯功能总结
本样例是基于OpenHarmony实现的即时通讯应用,目前已经支持文字、图片、文件、语音、emoji等讯息的快速发送与接收。
除此之外还实现了好友的添加与删除、黑名单、安全登录、私聊群聊、个人信息设置(二维码头像等)等功能的全方面支持。
代码地址:https:gitee。comisrcohosinstantmessageohos
市相丨国庆楼市再分化小县城躺平大城市打鸡血国庆黄金周前夕,一连串房地产利好政策接连出炉。其中,9月29日晚间,央行、银保监会率先提出阶段性调整差别化住房信贷政策。紧随其后,财政部于9月30日发文支持居民改善住房条……
戴着面具起舞,人生才会更灿烂朋友说,没有人脉和背景,想要在体制内混得好,不得不选择走另外一条路。没有听他说完,我便拒绝了,我不喜欢做那样违心的人!他未置可否,只是笑笑,不喜欢就不要去做了,你开……
德甲中场在国家队也只能打替补!日本海外阵容介绍中场篇(上)日本足球近些年来上下一致推行传控足球,迄今为止取得了十分重大的成果,其中一个表现就是涌现出众多技术细腻的中场人才,目前能进日本国家队的中场球员,无一不是在欧洲联赛踢球今天……
哪吒新车官方效果图曝光或为全新双门哪吒新车官方效果图曝光或为全新双门12月14日,哪吒汽车在官方社交平台发布新车效果图,新车将会定位为双门跑车,并且将会采用纯电驱动。但目前有关该车的更多信息,哪吒官方还未……
科技融入业务智慧赋能成长!中国人寿开展2022年科技月活动继农业经济、工业经济之后,蓬勃发展的数字经济成为新经济形态,其发展速度之快、辐射范围之广、影响程度之深前所未有,正在成为重组全球要素资源、重塑全球经济结构、改变全球竞争格局的关……
未来的路该怎么走年过三十的我此时让我迷失了方向,突然感觉迷茫又无助,可能是来自家庭的原因吧!也可能来自于自己的心态吧!总之一句话《累》,但是累也要撑着走下去,毕竟身后有父母和孩子,如果我倒下了……
360亿违约!2022年债券违约形势缓和,展期规模却创新高2022年即将收官,这一年我国债券市场违约形势有所缓和,但债券展期规模却创新高。《小债看市》统计,2022年以来我国债券市场共发生67只债券违约,违约规模有363。25亿……
我国暖温带最年轻的湿地生态系统,是这样长成的黄河三角洲国家级自然保护区被誉为鸟类国际机场,这里是东亚澳大利西亚和环西太平洋鸟类迁徙重要的停歇地、越冬地和繁殖地,鸟类371种,其中国家一级保护鸟类25种、国家二级保护鸟类6……
NBA晚报霍华德签新约,绿军不要安东尼,贝弗利嘲讽詹皇御用记北京时间9月10日,NBA休赛期正在进行,各队虽然还没有正式参加比赛,但是各种消息依然满天飞,就在即将过去的一天联盟又有多条消息传出,让我们一起去看看吧。1。国王队的基冈……
羽毛球最新世界排名公布!!男双上升迅速石宇奇终于回归世界羽联近期公布2022羽毛球9月最新的世界排名,按照羽联此前的要求,各项因疫情保留的积分逐步解冻,新的积分也将替换。中国队五个单项中都能看到进步,尤其是男双方面,属于是……
打破时空什么是SF作品中常见的虫洞?虽然虫洞一词经常出现在科幻作品中,但很难确切地解释得比从宇宙的一个点到另一个点弯曲是可能的更具体。为此,科学YouTube频道Kurzgesagt在一部动画电影中解释了什么是S……
刚刚,两个好消息来了,A股,周二行情预判炒股,横盘震荡是大多数人都不喜欢的行情,行情又大多数时间是横盘。大盘指数没有多少波动,不算上涨,也不算下跌,只是横盘小区间震荡。新能源行情分化,光伏、风电、储能超跌反弹,……