分享

鸿蒙上实现微信的聊天功能!

 新用户0118F7lQ 2022-07-26 发布于安徽
图片

WebSocket 是什么?

WebSocket 是 一种在单个 TCP 连接上进行全双工通讯的网络通信协议。

在以前没有 webSocket 的时候,大家都用 HTTP 协议进行网络通信,但是HTTP协议是一个无状态,无连接,单向的应用层协议。

因此只能让客户端对服务端进行单向请求,服务端无法主动向客户端发送消息,导致了像实时聊天这种业务开展起来比较困难。

有开发者就使用 HTTP 进行长轮询的方案,也就是说需要 HTTP 在一段时间内必须一直保持连接请求,以获取最新的服务器的消息。这样显然效率低下,而且非常浪费资源。

因此就诞生了 WebSocket,只需要进行一次连接,就可以一直保持全双工的通信状态。

Demo 展示

下面我们就来用官方提供的 WebSocket 接口实现一个简易实时聊天室的 Demo。

效果如下:

图片

代码实现可以看到官方文档的接口说明,我们只需要简单用到几个接口就可以实现我们的业务需求了。

https://developer.harmonyos.com/cn/docs/documentation/doc-guides/websocket-connection-0000001333321005

图片

①申请网络权限

在 config.json 文件里面注册网络权限,该权限允许程序打开网络套接字,进行网络连接。'reqPermissions': [

{

'name': 'ohos.permission.INTERNET'

}

]

②导入 webSocket 模块

import webSocket from '@ohos.net.webSocket';

③创建 webSocket 对象

接着我们调用 createWebSocket() 接口生成一个 webSocket 对象,并且保存起来。let ws = webSocket.createWebSocket();

④连接 webSocket 通道

调用 connect() 接口进行连接。这里需要一个 URL 作为参数传入,在这个 demo 中,直接用了一个以前开发好的服务器接口进行调用,但是不对外开放,因此大家只需要将自己开发好的接口地址放到“wsURL”内即可。

onInit() {

let that = this;

ws.connect('wsURL', (err, value) => {

if (!err) {

console.log('xxx---connect success');

} else {

console.log('xxx---connect fail, err:' + JSON.stringify(err));

}

});

},

⑤订阅通道内消息更新

这里我们调用 on(type:'message’)接口进行消息监听,这里要注意的是服务端传递过来的是字符串类型,所以如果消息是 JSON 对象,则需要用 JSON.parse() 进行解析,还原成 JSON 对象。    onInit() {

let that = this;

ws.on('message', (err, value) => {

console.log('xxx---on message, message:' + value);

//传递的是序列化后的字符串,需要解序列化为JSON对象

let dataObj = JSON.parse(value)

console.log('xxx---parse success---postId: '+dataObj.postId+',message:'+dataObj.message)

that.message.push(dataObj)

console.log('xxx---check message: '+JSON.stringify(that.message))

});

},

⑥发送消息紧接着调用 send() 接口进行消息的发送,这里注意,如果要传递的是 JSON 对象,要使用 JSON.stringify() 进行序列化操作, 保证我们传递的是流字符串的形式。

在该接口的回调中,我们也可以打印出来,看看消息是否发送成功。

sendMessage(){

let that  = this;

let data = {

postId:that.id,

message:that.sendMes

}

let dataStr = JSON.stringify(data)

ws.send(dataStr, (err, value) => {

if (!err) {

console.log('xxx---send success');

} else {

console.log('xxx---send fail, err:' + JSON.stringify(err));

}

});

that.message.push(data)

},

⑦隐藏标题栏

细心的小伙伴就会发现,我的 demo 展示的黑色标题栏不见了,其实是可以隐藏掉的,只需要在 config.json 文件中 module.abilities 下添加几行代码即可。'metaData':{

'customizeData':[

{

'name': 'hwc-theme',

'value': 'androidhwext:style/Theme.Emui.NoTitleBar',

'extra':''

}

]

}

⑧样式设计

接着就是简单设计一下界面样式,把获取到的消息渲染出来就完成啦。

实时聊天室

{{$item.message}}

<textarea id='textarea' class='textarea' extend='true'< p="">

placeholder='请输入聊天信息'

onchange='inputChange' >

发送 

.container {

display: flex;

flex-direction: column;

justify-content: center;

align-items: center;

left: 0px;

top: 0px;

width: 100%;

height: 100%;

}

.textarea {

placeholder-color: gray;

width: 70%;

}

.listItemDiv{

background-color: #ff87f3d0;

border-radius: 10px;

}

.listItemLeft{

margin: 10px;

width: 100%;

justify-content: flex-start;

}

.listItemRight{

margin: 10px;

width: 100%;

justify-content: flex-end;

}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多