连上后,退出时一定要关闭链接,如果不关闭,就算是点击的同一个用户聊天,也会重新打开一个链接,最多打开5个长链接。
var SocketTask
Page({
/**
* 页面的初始数据
*/
data: {
topLabel: '',
iploads: app.iploads,
inputlg: 0,
message: '',//消息内容
toUser:'',//接收用户id
socketStatus:false,//有没有打开webSocket链接
xtyhbh:'',//医生聊天BH
},
bindmsg(e) {//输入文字不大于300
if (e.detail.value.length <= 300) {
this.setData({
message: e.detail.value,
inputlg: e.detail.value.length
})
}
},
openSocket() {//监听状态
SocketTask.onOpen(() => {
// console.log('WebSocket 已连接')
this.setData({socketStatus:true})
})
SocketTask.onClose(() => {
// console.log('WebSocket 已断开')
this.setData({socketStatus:false})
})
SocketTask.onError(error => {
// console.error('发生错误', JSON.stringify(error))
// this.setData({
// loading: false
// })
})
// 监听服务器推送消息
SocketTask.onMessage(message => {
// console.log('收到服务器信道消息');
message.data=JSON.parse(message.data)
console.log('socket message:', message.data)
let chatList=[]
switch (Number(message.data.type)) {
case 9:
chatList=this.data.chatList
chatList.push({
egp: 1,
isSelf: true,
content: this.data.message,
imgSrc: 'https://ossweb-img.qq.com/images/lol/web201310/skin/big143004.jpg',
time: message.data.formDate
})
this.setData({chatList,message:'',inputlg:0})
break;
case 3:
chatList=this.data.chatList
chatList.push({
egp: 1,
isSelf: false,
content: message.data.message,
imgSrc: 'https://ossweb-img.qq.com/images/lol/web201310/skin/big143004.jpg',
time: message.data.formDate
})
this.setData({chatList})
break;
}
})
},
openSocket() {//第二种监听写法
wx.onSocketOpen(() => {
// console.log('WebSocket 已连接')
this.setData({socketStatus:true})
})
wx.onSocketClose(() => {
// console.log('WebSocket 已断开')
this.setData({socketStatus:false})
})
wx.onSocketError(error => {
console.error('发生错误', JSON.stringify(error))
// this.setData({
// loading: false
// })
})
// 监听服务器推送消息
wx.onSocketMessage(message => {
// console.log('收到服务器信道消息');
message.data=JSON.parse(message.data)
console.log('socket message:', message.data)
let chatList=[]
switch (Number(message.data.type)) {
case 9:
chatList=this.data.chatList
chatList.push({
egp: 1,
isSelf: true,
content: this.data.message,
imgSrc: 'https://ossweb-img.qq.com/images/lol/web201310/skin/big143004.jpg',
time: message.data.formDate
})
this.setData({chatList,message:'',inputlg:0})
break;
case 3:
chatList=this.data.chatList
chatList.push({
egp: 1,
isSelf: false,
content: message.data.message,
imgSrc: 'https://ossweb-img.qq.com/images/lol/web201310/skin/big143004.jpg',
time: message.data.formDate
})
this.setData({chatList})
break;
}
})
},
webSocket(){//长链接请求
SocketTask=wx.connectSocket({
url: 'http://192.168.3.5'+'?token=55555555555555555555555ss',
})
// SocketTask.onOpen((result) => {console.log('onOpen: true',result)})
// SocketTask.onMessage((result) => {console.log('onMessage: true',result)})//服务器返回的消息
this.openSocket()
},
sendSocketMessage() {//发送消息
if(this.data.socketStatus){
if(this.data.message){
let data={
type:3,
toUser:this.data.xtyhbh,//发送给谁
// formUser:'',//谁发送的
message:this.data.message,//发送的消息
sendNo:this.uuid2()}//每条消息ID
SocketTask.send({data: JSON.stringify(data)})
}else{
Toast.fail('消息不能为空');
}
}else{
Toast.fail('发送失败,未连接上服务器');
}
},
chat() {//滚动到底部
this.setData({
chat: this.data.chatList.length-1,
})
},
uuid2() {//uuid2随机数32位
var s = [];
var hexDigits = "0123456789abcdef";
for (var i = 0; i < 32; i++) {
s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
}
s[14] = "4"; // bits 12-15 of the time_hi_and_version field to 0010
s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01
s[8] = s[13] = s[18] = s[23];
var uuid = s.join("");
return uuid;
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
this.setData({
bh: options.bh,
topLabel: options.xm
})
this.webSocket()
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
SocketTask.close()//关闭webSocket链接
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
SocketTask.close()//关闭webSocket链接
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
}
})
定位到底部最后一条信息
<scroll-view scroll-into-view="chat{{chat}}">
<view class="cu-chat" id="chat{{index}}" wx:for="{{chatList}}" wx:key="index" wx:for-item="chatitem">
</view>
</scroll-view>