客户端触发服务端事件失败

tender

前端事件触发:

socket.send('getInfoaaaa',uid);
socket.on('getInfoaaaReturn', function(msg){
   alert(msg);
});

服务端事件:

$socket->on('getInfoaaaa',function($uid)use($socket){
        $socket-> emit('getInfoaaaReturn',$uid);
});

开启服务端监听之后 前端没有收到结果,也没有任务的报错,之前写的都是可以的,不知道为啥。。。求大神指教。

4996 7 0
7个回答

walkor 打赏

把代码贴全

  • 暂无评论
tender

前端:

uid = 1022905503;
// 连接服务端
var socket = io('https://dzpk.752g.com:2120');
// 连接后登录
socket.on('connect', function(){
    socket.emit('login', uid);
});
//以上为socket.io 连接代码 不可省略
//*************************************************************************//

// 后端推送来消息时
socket.on('new_msg', function(msg){
    $('#content').html('收到消息:'+msg);
    $('.notification.sticky').notify();
});

// 后端推送来在线数据时
socket.on('update_online_count', function(online_stat){
    $('#online_box').html(online_stat);
});
socket.emit('getInfoaaaa',uid);
socket.on('getInfoaaaReturn', function(msg){
    alert(msg);
});

服务端:

$sender_io->on('connection', function($socket){

    // 当客户端发来登录事件时触发
    $socket->on('login', function ($uid)use($socket){

        global $uidConnectionMap, $last_online_count, $last_online_page_count;

        // 已经登录过了
        if(isset($socket->uid)){
            return;
        }

        // 更新对应uid的在线数据
        $uid = (string)$uid;
        if(!isset($uidConnectionMap))
        {
            $uidConnectionMap = 0;
        }
        // 这个uid有++$uidConnectionMap个socket连接
        ++$uidConnectionMap;
        // 将这个连接加入到uid分组,方便针对uid推送数据
        $socket->join($uid);
        $socket->uid = $uid;

        // 更新这个socket对应页面的在线数据   用来测试是否连接成功
        $socket->emit('update_online_count', "当前<b>{$last_online_count}</b>人在线,共打开<b>{$last_online_page_count}</b>个页面");

    });

    //客户端请求打打主播的牌面信息
    $socket->on('getInfoaaaa',function($uid)use($socket){
        $socket-> emit('getInfoaaaReturn',$uid);
    });

    // 当客户端断开连接是触发(一般是关闭网页或者跳转刷新导致)
    $socket->on('disconnect', function () use($socket) {
        if(!isset($socket->uid))
        {
             return;
        }
        global $uidConnectionMap, $sender_io;
        // 将uid的在线socket数减一
        if(--$uidConnectionMap <= 0)
        {
            unset($uidConnectionMap);
        }
    });

});

里面还有其他的事件,结构是 附件那样子的,可以正常使用,但是上面的那个不着调为什么就不能用。。

  • 暂无评论
walkor 打赏

客户端与服务端链接建立成功前无法给服务端emit事件,客户端与服务端建立链接成功后会触发connect事件,在connect事件触发后才能emit。

socket.emit('getInfoaaaa',uid);
执行的时候并没触发connect事件,也就是说这时候与服务端还没建立链接,服务端当然收不到任何数据。

socket.on('connect', function(){
    socket.emit('login', uid);
});

你可以参考上面官网demo源码向服务端emit login事件部分写法,写在connect事件的里面,也就是connect事件触发后执行emit才行。

  • 暂无评论
tender

我之前有五六个事件都是按照附件中的那样写的 但是 可以正常使用吖。。

  • 暂无评论
tender

但如果写到connect事件里面,当连接服务端成功的时候就直接触发了啊,但 我需要用户的行为操作去触发这个事件,我也有像附件中那样写的五个事件,可以正常使用,

那如果我之前的写法是错误的,我需要用户操作触发事件时,这个怎么写?

  • 暂无评论
walkor 打赏

上面说的是参考啊,写在connect 里只是个参考,主要用意还是提示你要想emit成功必须保证connect事件已经触发,也就是链接已经建立。

比如像你截图里socket.emit('buyGift', $uid, 790, 2, 20);是写在click事件里的,用户点击的时候已经触发connect事件了,也就是用户点击的时候链接已经建立了。

但是页面js一加载就触发socket.emit('getInfoaaaa',uid); 肯定是不行的,这时候基本可以确定connect事件没触发,链接还没建立。

  • 暂无评论
tender

还真是。。谢大牛,我里面还有一个那种直接触发的 ,但是 可以使用。奇怪。。上面的问题把它放到 click事件中就可以了。。

  • 暂无评论
年代过于久远,无法发表回答
×
🔝