先上一下全部代碼,嫌太多可以看下面的
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);//只能這樣群發(fā)了 前端根據(jù)用戶的ID 從推送的數(shù)據(jù)里撿起屬于自己的
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事件回調(diào)函數(shù)
$socket->on('init', function ($data) use($socket) {
//這里判斷用戶是否在數(shù)組里結果也沒起效 控制臺里依舊顯示多了一個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();
}
在拿到要推送的數(shù)據(jù)后,Uid data 測試都不是 空后
$adc["code"]=200;
$adc["message"]='成功';
$adc['uid']=$data->post('uid');//要推送的UID 但是不知道怎么送出去
$adc['data']=json_decode($data->post('msg'),true);// 要推送的數(shù)據(jù)
使用 //$io->to($data->post('uid'))->emit('push', $adc);//推送給指定的ID 不起作用??
求教應該如何才能正確發(fā)送出去,現(xiàn)在用的群發(fā),
$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)觸發(fā)客戶端的chat message from server事件
socket.on('chat message ' + uid, function(msg){
console.log('get message:' + msg + ' from server');
});
</script>
在php端獲取到uid以后觸發(fā)uid對應的事件
// 觸發(fā)所有客戶端定義的chat message from server事件
$io->emit("chat message {$uid}", $msg);
你仔細看看他的自定義事件,這個我是根據(jù)他文檔那改的,沒有測試過,但是理論應該是可行的.
$io->emit("chat message {$uid}", $msg); 這樣是群發(fā)??! 我現(xiàn)在也是群發(fā)出去帶了UID ,前端判斷是不是當前用戶的,如果有當前用戶一致的ID那就執(zhí)行前端事件,$io->emit("chat message {$uid}", $msg); 第一個參數(shù)是如何溝通,例如我前端寫了一個 login 這個參數(shù)對上之后,就在前端socket.io的login 里出現(xiàn)數(shù)據(jù),第二個事要傳給前端的數(shù)據(jù)……所以還是謝謝您,您的回答對我沒有幫助………
socket.io主要是通過事件來進行通訊交互,你要理解這句話,基于事件也就是說對它來說是發(fā)送給某個事件的,所以你自己上面那個 $io->emit('push',$adc); 自然就是群發(fā)給所有人,因為你那是所有人都訂閱了這個事件的,我上面發(fā)給你那示例代碼,你自己注意看js 那的
socket.on('chat message ' + uid, function(msg){
console.log('get message:' + msg + ' from server');
});
這句話,這個就相當于給這個用戶單獨創(chuàng)建一個基于它uid的事件,這個事件是只有他一個人擁有的,所以你在后臺發(fā)送這個,
$io->emit("chat message {$uid}", $msg);
是不會推送給別人的,因為uid 對不上的話,它根本沒有這個事件.
我的前端是不是直接的JS 用的VUE 所以這樣的代碼
sockets:{
connect(data){
console.log('鏈接connect',data)
},
pusha(msg){// 這里的pusha 沒法加變量的
}
let socket = {};
socket['connect'] = function(data){
}
socket['push'+uid] = function(msg){
};
sockets:socket
我前面那個思路是正確的,我自己已經(jīng)測試過了,至于vue寫法,你試試這樣看看行不行,理論上應該上應該是沒問題的.
你的socket不是已經(jīng)存入$online了嗎?在再調(diào)用出來就可以了呀。
$online[$data['uid']]->emit('init',$data);
我是這樣弄的,你可以試試