本样例是基于即时通讯(简称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第三方组件elementnameemojiExpressionsrcc2021imgdataimg。jpgdatasrc。。。。commoncomponentsemojiExpressionemojiExpression。hmlelement第三方组件的展示布局textstyleleft:25fp;top:10fp;所有表情textemojiExpressionemojiExpression 即时通讯功能总结 本样例是基于OpenHarmony实现的即时通讯应用,目前已经支持文字、图片、文件、语音、emoji等讯息的快速发送与接收。 除此之外还实现了好友的添加与删除、黑名单、安全登录、私聊群聊、个人信息设置(二维码头像等)等功能的全方面支持。 代码地址:https:gitee。comisrcohosinstantmessageohos