swool在linux系统使用,不支持win系统,需要线上服务器。
线上代码:
<?php
//创建WebSocket Server对象,监听0.0.0.0:9502端口
$ws = new Swoole\WebSocket\Server('0.0.0.0', 9501);
//实例化Redis
$redis = new Redis();
//对redis进行连接
$redis->connect('127.0.0.1','6379');
//监听WebSocket连接打开事件
$ws->on('Open', function ($ws, $request) {
//向小程序端进行一个连接返回,告知用户已经连接上服务器,返回值需要转为json数据格式
$ws->push($request->fd, json_encode(['msg'=>'用户已连接'],true));
});
$server->set([
'heartbeat_idle_time' => 600,
'heartbeat_check_interval' => 60,
// daemonize => true
]);
//监听WebSocket消息事件
$ws->on('Message', function ($ws, $frame) use ($redis) {
//将我们从小程序端传递过来的数据转换成数组格式进行处理
$data = json_decode($frame->data,true);
//通过小程序端传递过来的类型进行处理
switch($data['type']){
//如果类型为连接
case "open" :
//将登录的用户昵称设为键,保存用户id
$redis->set($data['my'],$frame->fd);
break;
//如果类型为发送
case "send" :
//取出我们发送给对方的id
//【当前登陆用户为yuchen,我们要发送给miao,存进去的用户信息为yuchen信息,取出来的是miao信息】
//【当前登陆用户为miao,我们要发送给yuchen,存进去的用户信息为miao信息,取出来的是yuchen信息】
$toId = $redis->get($data['he']);
//将用户昵称和所要发送的消息返回给小程序端
$msg = [
'user' => $toId,
'msg' => $data['data']
];
// print_r($msg);
//我们要将消息push给对方,也就是当前登录yuchen,push给miao
$ws->push($msg['user'], json_encode($msg));
break;
default:
break;
}
});
//监听WebSocket连接关闭事件
$ws->on('Close', function ($ws, $fd) {
echo "client-{$fd} is closed\n";
});
$ws->start();
小程序端 js
// pages/server/server.js
Page({
/**
* 页面的初始数据
*/
data: {
msg: '',
list: [],
},
setMsg(e) {
// console.log(e.detail.value);
let msg = e.detail.value
this.setData({
msg: msg
})
},
getMsg(e) {
let id = 'yuchen'
let msg = this.data.msg
let list = this.data.list
list.push({
name: 2,
msg: msg
})
this.setData({
list, id: 2
})
let send = {
he: id,
my: 2,
type: 'send',
data: msg
}
this.send(JSON.stringify(send))
},
send(data) {
wx.sendSocketMessage({
data: data
});
},
cache()
{
let list = this.data.list
wx.request({
url: 'http://www.yiliao.com/api/cache',
data: {},
header: { 'content-type': 'application/json' },
method: 'GET',
dataType: 'json',
responseType: 'text',
success: (result) => {
list=result.data.data
this.setData({
list
})
},
fail: () => { },
complete: () => { }
});
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
let id = 'yuchen'
wx.connectSocket({
url: 'ws://ly.linyin.xyz:9501',
});
wx.onSocketOpen(result => {
let open = {
he: id,
my: 2,
type: 'open',
}
this.send(JSON.stringify(open))
});
// this.sendTime()
this.message()
},
message() {
wx.onSocketMessage((result) => {
let data = JSON.parse(result.data)
let list = this.data.list
list.push({
name: data.user,
msg: data.msg
})
this.setData({
list, id: 2
})
})
},
sendTime(time = 3000, status = true) {
if (status == true) {
let timer = setInterval(function () {
console.log('心跳已连接');
wx.sendSocketMessage({
data: JSON.stringify({
type: 'type'
}),
fail: () => {
console.log('心跳连接失败');
wx.closeSocket();
wx.showToast({
title: '关闭心跳连接',
icon: 'none',
duration: 1500,
});
clearInterval(timer)
}
});
}, time)
}
},
})