前端事件觸發(fā):
socket.send('getInfoaaaa',uid);
socket.on('getInfoaaaReturn', function(msg){
alert(msg);
});
服務(wù)端事件:
$socket->on('getInfoaaaa',function($uid)use($socket){
$socket-> emit('getInfoaaaReturn',$uid);
});
開啟服務(wù)端監(jiān)聽之后 前端沒有收到結(jié)果,也沒有任務(wù)的報(bào)錯(cuò),之前寫的都是可以的,不知道為啥。。。求大神指教。
前端:
uid = 1022905503;
// 連接服務(wù)端
var socket = io('https://dzpk.752g.com:2120');
// 連接后登錄
socket.on('connect', function(){
socket.emit('login', uid);
});
//以上為socket.io 連接代碼 不可省略
//*************************************************************************//
// 后端推送來消息時(shí)
socket.on('new_msg', function(msg){
$('#content').html('收到消息:'+msg);
$('.notification.sticky').notify();
});
// 后端推送來在線數(shù)據(jù)時(shí)
socket.on('update_online_count', function(online_stat){
$('#online_box').html(online_stat);
});
socket.emit('getInfoaaaa',uid);
socket.on('getInfoaaaReturn', function(msg){
alert(msg);
});
服務(wù)端:
$sender_io->on('connection', function($socket){
// 當(dāng)客戶端發(fā)來登錄事件時(shí)觸發(fā)
$socket->on('login', function ($uid)use($socket){
global $uidConnectionMap, $last_online_count, $last_online_page_count;
// 已經(jīng)登錄過了
if(isset($socket->uid)){
return;
}
// 更新對應(yīng)uid的在線數(shù)據(jù)
$uid = (string)$uid;
if(!isset($uidConnectionMap))
{
$uidConnectionMap = 0;
}
// 這個(gè)uid有++$uidConnectionMap個(gè)socket連接
++$uidConnectionMap;
// 將這個(gè)連接加入到uid分組,方便針對uid推送數(shù)據(jù)
$socket->join($uid);
$socket->uid = $uid;
// 更新這個(gè)socket對應(yīng)頁面的在線數(shù)據(jù) 用來測試是否連接成功
$socket->emit('update_online_count', "當(dāng)前<b>{$last_online_count}</b>人在線,共打開<b>{$last_online_page_count}</b>個(gè)頁面");
});
//客戶端請求打打主播的牌面信息
$socket->on('getInfoaaaa',function($uid)use($socket){
$socket-> emit('getInfoaaaReturn',$uid);
});
// 當(dāng)客戶端斷開連接是觸發(fā)(一般是關(guān)閉網(wǎng)頁或者跳轉(zhuǎn)刷新導(dǎo)致)
$socket->on('disconnect', function () use($socket) {
if(!isset($socket->uid))
{
return;
}
global $uidConnectionMap, $sender_io;
// 將uid的在線socket數(shù)減一
if(--$uidConnectionMap <= 0)
{
unset($uidConnectionMap);
}
});
});
里面還有其他的事件,結(jié)構(gòu)是 附件那樣子的,可以正常使用,但是上面的那個(gè)不著調(diào)為什么就不能用。。
客戶端與服務(wù)端鏈接建立成功前無法給服務(wù)端emit事件,客戶端與服務(wù)端建立鏈接成功后會(huì)觸發(fā)connect事件,在connect事件觸發(fā)后才能emit。
socket.emit('getInfoaaaa',uid);
執(zhí)行的時(shí)候并沒觸發(fā)connect事件,也就是說這時(shí)候與服務(wù)端還沒建立鏈接,服務(wù)端當(dāng)然收不到任何數(shù)據(jù)。
socket.on('connect', function(){
socket.emit('login', uid);
});
你可以參考上面官網(wǎng)demo源碼向服務(wù)端emit login事件部分寫法,寫在connect事件的里面,也就是connect事件觸發(fā)后執(zhí)行emit才行。
但如果寫到connect事件里面,當(dāng)連接服務(wù)端成功的時(shí)候就直接觸發(fā)了啊,但 我需要用戶的行為操作去觸發(fā)這個(gè)事件,我也有像附件中那樣寫的五個(gè)事件,可以正常使用,
那如果我之前的寫法是錯(cuò)誤的,我需要用戶操作觸發(fā)事件時(shí),這個(gè)怎么寫?
上面說的是參考啊,寫在connect 里只是個(gè)參考,主要用意還是提示你要想emit成功必須保證connect事件已經(jīng)觸發(fā),也就是鏈接已經(jīng)建立。
比如像你截圖里socket.emit('buyGift', $uid, 790, 2, 20);是寫在click事件里的,用戶點(diǎn)擊的時(shí)候已經(jīng)觸發(fā)connect事件了,也就是用戶點(diǎn)擊的時(shí)候鏈接已經(jīng)建立了。
但是頁面js一加載就觸發(fā)socket.emit('getInfoaaaa',uid); 肯定是不行的,這時(shí)候基本可以確定connect事件沒觸發(fā),鏈接還沒建立。