首先,看懂这个图,真的很重要的!不骗你!!!
我也不想说什么,累了,折腾一天了!直接上代码了!
前端代码
ws = new WebSocket("ws://127.0.0.1:8282");
// 服务端主动推送消息时会触发这里的onmessage
ws.onopen = function(){};
ws.onmessage = function(e){
console.log(e);
// json数据转换成js对象
var data = eval("("+e.data+")");
var type = data.type || '';
switch(type){
// Events.php中返回的init类型的消息,将client_id发给后台进行uid绑定
case 'init':
var init=JSON.stringify({"type":'init','uid':10003});
ws.send(init);
break;
case 'online':
$.post("", {uid: data.uid}, function(data){
if(data.code==200){
console.log(data.msg)
}else{
console.log(data.msg)
}
}, 'json');
default :
console.log(e.data);
}
};
ws.onclose = function(e)
{
if(e.type=="close"){
$.post("", {uid: 10003}, function(data){
if(data.code==200){
console.log(data.msg)
}else{
console.log(data.msg)
}
}, 'json');
}
};
后端代码:
第一:需要修改一下协议
$gateway = new Gateway("WebSocket://0.0.0.0:8282")
第二:响应函数
/**
* 当客户端连接时触发
* 如果业务不需此回调可以删除onConnect
*
* @param int $client_id 连接id
*/
public static function onConnect($client_id)
{
global $num;
++$num;
echo "ConnectTotal:".$num."\r\n";
// 向当前client_id发送数据
//Gateway::sendToClient($client_id, "Hello $client_id\r\n");
// 向所有人发送
//Gateway::sendToAll("$client_id login\r\n");
Gateway::sendToClient($client_id, json_encode(array(
'type' => 'init',
'client_id' => $client_id
)));
}
/**
* 当客户端发来消息时触发
*/
public static function onMessage($client_id, $message)
{
// 向所有人发送
//Gateway::sendToAll("$client_id said $message\r\n");
if(!$message){
return false;
}
$message_data=json_decode($message,true);
switch ($message_data['type']){
case 'init':
Gateway::bindUid($client_id,$message_data['uid']);
$sdata=[
'type' => 'online',
'client_id' => $client_id,
'uid'=>$message_data['uid']
];
Gateway::sendToUid($message_data['uid'],json_encode($sdata));
break;
default:
return false;
}
}
/**
* 当用户断开连接时触发
* @param int $client_id 连接id
*/
public static function onClose($client_id)
{
$data=[
'type' => 'close',
'client_id' => $client_id,
];
Gateway::sendToClient($client_id,json_encode($data));
}
第三:最重要的!MVC通讯使用gatewayclient
composer安装:
>composer require workerman/gatewayclient
通讯:
public function say(){
$data=[
'type'=>'say',
'data'=>123456
];
Gateway::$registerAddress = "127.0.0.1:1238";
Gateway::isUidOnline(10003);
Gateway::sendToUid(10003,json_encode($data));
}