先上一下全部代码,嫌太多可以看下面的
public static $online = [];//用来记录在线用户
public function index()
{
$context = array(
'ssl' => array(
'local_cert' => $_SERVER['DOCUMENT_ROOT'].'\lx.dg.com.cer',
'local_pk' => $_SERVER['DOCUMENT_ROOT'].'\lx.dg.com.key',
'verify_peer' => false,
)
);
// $io = new SocketIO(8282,$context);//socket的端口
$io = new SocketIO(8282);//socket的端口
$io->on('workerStart', function () use ($io) {
$inner_http_worker = new Worker('http://0.0.0.0:5880');
$inner_http_worker->onMessage = function ($http_connection, $data) use ($io) {
// isset(static::$online[$data->post('uid')]);
$adc["code"]=200;
$adc["message"]='成功';
$adc['uid']=$data->post('uid');//要推送的UID 但是不知道怎么送出去
$adc['data']=json_decode($data->post('msg'),true);
//$io->to($data->post('uid'))->emit('push', $adc);//这个试了不起效果
$io->emit('push',$adc);//只能这样群发了 前端根据用户的ID 从推送的数据里捡起属于自己的
if(!$data->post('msg')) {
$rb=input('param.');
$rc=input('');
$http_connection->send('fail, $_GET["msg"] not found!!rb:');
}
$http_connection->send('ok');
};
$inner_http_worker->listen();
});
// 当有客户端连接时
$io->on('connection', function($socket) {
// 定义chat message事件回调函数
$socket->on('init', function ($data) use($socket) {
//这里判断用户是否在数组里结果也没起效 控制台里依旧显示多了一个ID
//前端页面刷新就多一个
$data = json_decode($data, true);
$socket->uid = $data['uid'];
static::$online[$data['uid']] =$socket;
$socket->emit('init', 'login listen success', function ($res){});
});
$socket->on('push', function ($data) use($socket) {
$socket->emit('push', '这是push7788', function ($res){});
// $io->emit('find message from server',$data);
});
$socket->on('disconnect', function($socket){
static::$online[$socket->uid];
});
});
Worker::runAll();
}
在拿到要推送的数据后,Uid data 测试都不是 空后
$adc["code"]=200;
$adc["message"]='成功';
$adc['uid']=$data->post('uid');//要推送的UID 但是不知道怎么送出去
$adc['data']=json_decode($data->post('msg'),true);// 要推送的数据
使用 //$io->to($data->post('uid'))->emit('push', $adc);//推送给指定的ID 不起作用??
求教应该如何才能正确发送出去,现在用的群发,
$io->emit('push',$adc);
凑合能解决一下,看了文档,刚上手真的一点路都找不不到,百度出来的几乎上没有多少能用的
我去给你看了一下,socket.io主要是通过事件来进行通讯交互的。所以我觉得可以这样来处理,在js端定义一个事件
<script>
//这里 uid 实际应该对应每个用户的唯一uid
let uid = 1;
// 连接服务端
var socket = io('http://127.0.0.1:3120');
// 服务端通过emit('chat message from server', $msg)触发客户端的chat message from server事件
socket.on('chat message ' + uid, function(msg){
console.log('get message:' + msg + ' from server');
});
</script>
在php端获取到uid以后触发uid对应的事件
// 触发所有客户端定义的chat message from server事件
$io->emit("chat message {$uid}", $msg);
你仔细看看他的自定义事件,这个我是根据他文档那改的,没有测试过,但是理论应该是可行的.
$io->emit("chat message {$uid}", $msg); 这样是群发啊! 我现在也是群发出去带了UID ,前端判断是不是当前用户的,如果有当前用户一致的ID那就执行前端事件,$io->emit("chat message {$uid}", $msg); 第一个参数是如何沟通,例如我前端写了一个 login 这个参数对上之后,就在前端socket.io的login 里出现数据,第二个事要传给前端的数据……所以还是谢谢您,您的回答对我没有帮助………
socket.io主要是通过事件来进行通讯交互,你要理解这句话,基于事件也就是说对它来说是发送给某个事件的,所以你自己上面那个 $io->emit('push',$adc); 自然就是群发给所有人,因为你那是所有人都订阅了这个事件的,我上面发给你那示例代码,你自己注意看js 那的
socket.on('chat message ' + uid, function(msg){
console.log('get message:' + msg + ' from server');
});
这句话,这个就相当于给这个用户单独创建一个基于它uid的事件,这个事件是只有他一个人拥有的,所以你在后台发送这个,
$io->emit("chat message {$uid}", $msg);
是不会推送给别人的,因为uid 对不上的话,它根本没有这个事件.
老哥的意思是在前端的标记里加上UID 就像我是 push1 你是push2?? 但是这样我真的不会写了,函数名是无法加变量的啊
我的前端是不是直接的JS 用的VUE 所以这样的代码
sockets:{
connect(data){
console.log('链接connect',data)
},
pusha(msg){// 这里的pusha 没法加变量的
}
我前面那个思路是正确的,我自己已经测试过了,至于vue写法,你试试这样看看行不行,理论上应该上应该是没问题的.
你的socket不是已经存入$online了吗?在再调用出来就可以了呀。
$online[$data['uid']]->emit('init',$data);
我是这样弄的,你可以试试