uniapp使用uni自带websocket进行即时通讯
最近再办一个uniapp做的即时通讯,把其中思路记载一下。
技术栈采用uniapp+uview+vue2进行开发。
一、使用uni封装好的websocket。
下面的从uniapp官网截图的Api
uni.connectSocket() :这个方法可以让我们创建一个webSocket的连接,里面包含几个参数,url是写ws的连接地址,没有的话肯定是连接不上服务器,其他的没用过。用的时候再看。
// 创建webSocket this.webSocketTask = uni.connectSocket({ url: '这里面写的是连接地址', header: { 'content-type': 'application/json' }, success(res) { console.log('成功', res); }, })
我们在data中定义一个webSocket:null,然后把websocket对象赋给他,以供下面的方法使用。
uni.onSocketOpen()是用来监听websocket连接成功的事件,方法里面跟一个回调函数,可以通过res参数拿到响应头。
//监听WebSocket连接打开事件 this.webSocketTask.onOpen((res) => { console.info("监听WebSocket连接打开事件", res) });
这个没用过,过!!!
通过uni.onSocketMessag()可以接收到服务器返回的消息。
//接收websocket消息及处理 this.webSocketTask.onMessage((res) => { let data = JSON.parse(res.data); //判断服务器返回的type类型 switch (data.type){ //如果返回的ping,说明服务端ping客户端 case 'ping': //我们要给服务器说一个pong告诉服务器我还活着 this.webSocketTask.send({ data: JSON.stringify({ type: 'pong' }) }); break; //登录更新用户列表 //如果type是init,说明服务器知道我们活着,给我们传一个标识,我们通过这个标识去请求接口, 建立唯一链接。 case 'init': uni.setStorageSync('client_id', data.client_id); this.$u.post('common/pub/bindUid',{ client_id: data.client_id, user_id: this.userId }).then(res => { this.webSocketTask.send({ data: JSON.stringify({ type: 'bindUid', user_id:2 }) }); }); break; case 'simple': this.userList.push(data.data) this.scrollToBottom() break; case 'group': this.userList.push(data.data) this.scrollToBottom() break }
这个的话按官方文档说的就是需要卸载uni。onSocketOpen回调里面才行。但是我直接通过实例对象发也可以。
this.webSocketTask.send({ data: JSON.stringify({type: 'pong'}) });
注意:websocket只能接收字符串,记得转换类型
这个就是关闭连接,写在onUnload钩子中就行
onUnload(){ uni.closeSocket({ success:() => { console.info("退出成功") }, }) },
最后一个就是监听websocket是否关闭。
uniapp官网文档:uni.connectSocket(OBJECT) | uni-app官网 (dcloud.net.cn)https://uniapp.dcloud.net.cn/api/request/websocket.html
uni-app官网 (dcloud.net.cn)https://uniapp.dcloud.net.cn/api/request/socket-task.html完整代码:
onLoad(){ this.socket() }; methods:{ socket(){ //创建webSocket this.webSocketTask = uni.connectSocket({ url: 'ws地址', header: { 'content-type': 'application/json' }, success(res) { console.log('成功', res); }, }) // 监听WebSocket连接打开事件 this.webSocketTask.onOpen((res) => { console.info("监听WebSocket连接打开事件", res) }); // 监听WebSocket错误 uni.onSocketError((res) => { console.info("监听WebSocket错误" + res) }); } onShow(){ // 接收websocket消息及处理 this.webSocketTask.onMessage((res) => { let data = JSON.parse(res.data); switch (data.type) { // 服务端ping客户端 case 'ping': this.webSocketTask.send({ data: JSON.stringify({ type: 'pong' }) }); break; // 登录 更新用户列表 case 'init': uni.setStorageSync('client_id', data.client_id); this.$u.post('接口', { client_id: data.client_id, user_id: this.userId }).then(res => { this.webSocketTask.send({ data: JSON.stringify({ type: 'bindUid', user_id: this.userId }) }); }); break; case 'simple': this.userList.push(data.data) this.scrollToBottom() break; case 'group': // this.groupMenuList() this.userList.push(data.data) this.scrollToBottom() break } }); } onUnload() { uni.closeSocket({ success: () => { console.info("退出成功") }, }) },
只是个人简单记录!!!