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

前端事件触发:
socket.send('getInfoaaaa',uid);
socket.on('getInfoaaaReturn', function(msg){
alert(msg);
});

服务端事件:
$socket->on('getInfoaaaa',function($uid)use($socket){
$socket-> emit('getInfoaaaReturn',$uid);
});

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

walkor

赞同来自:

把代码贴全

tender - 90后的IT男

赞同来自:

前端:
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[$uid]))
{
$uidConnectionMap[$uid] = 0;
}
// 这个uid有++$uidConnectionMap[$uid]个socket连接
++$uidConnectionMap[$uid];
// 将这个连接加入到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[$socket->uid] <= 0)
{
unset($uidConnectionMap[$socket->uid]);
}
});


});

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

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 - 90后的IT男

赞同来自:

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

tender - 90后的IT男

赞同来自:

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

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

walkor

赞同来自:

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

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

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

tender - 90后的IT男

赞同来自:

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

要回复问题请先登录注册