看文档一知半解?对单人的ID 发送不出去,无法唤醒前端只能群发

伊伦哲罗

先上一下全部代码,嫌太多可以看下面的

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);
凑合能解决一下,看了文档,刚上手真的一点路都找不不到,百度出来的几乎上没有多少能用的

2213 1 0
1个回答

q13113671764

我去给你看了一下,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);

你仔细看看他的自定义事件,这个我是根据他文档那改的,没有测试过,但是理论应该是可行的.

  • 伊伦哲罗 2020-08-04

    $io->emit("chat message {$uid}", $msg); 这样是群发啊! 我现在也是群发出去带了UID ,前端判断是不是当前用户的,如果有当前用户一致的ID那就执行前端事件,$io->emit("chat message {$uid}", $msg); 第一个参数是如何沟通,例如我前端写了一个 login 这个参数对上之后,就在前端socket.io的login 里出现数据,第二个事要传给前端的数据……所以还是谢谢您,您的回答对我没有帮助………

  • q13113671764 2020-08-04

    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 对不上的话,它根本没有这个事件.

  • 伊伦哲罗 2020-08-06

    老哥的意思是在前端的标记里加上UID 就像我是 push1 你是push2?? 但是这样我真的不会写了,函数名是无法加变量的啊

  • 伊伦哲罗 2020-08-06

    我的前端是不是直接的JS 用的VUE 所以这样的代码
    sockets:{
    connect(data){
    console.log('链接connect',data)
    },
    pusha(msg){// 这里的pusha 没法加变量的

    }

  • q13113671764 2020-08-07
    let socket = {};
    socket['connect'] = function(data){
    }
    socket['push'+uid] = function(msg){
    
    };
    
    sockets:socket

    我前面那个思路是正确的,我自己已经测试过了,至于vue写法,你试试这样看看行不行,理论上应该上应该是没问题的.

  • guofei886 2020-10-02

    你的socket不是已经存入$online了吗?在再调用出来就可以了呀。
    $online[$data['uid']]->emit('init',$data);
    我是这样弄的,你可以试试

年代过于久远,无法发表回答
🔝