情況是這樣的:
$web = new WebServer();
$app = new Worker("xxx://0.0.0.0:8383")
啟動后另一個客戶端連接了這個$app的端口,
$clientA $clientB $clientC
web有個login.php頁面,想在這里直接給寫xxx協(xié)議給$clientA或$ClientB或$ClientC任意一個客戶端發(fā)消息。
別人都說用GateWay可以做到,我也下了小蝌蚪源碼來看,感覺并不是我說的這個功能,從配置上來說都比我說的業(yè)務(wù)麻煩很多。
我自已也寫了個把$ClientA ..C存到Store里去,但$clientA是用AsynTcpConnection做的,有onMessage,onClose這些匿名函數(shù),存不了Store
web 的login.php 里面建立一個socket,連$app worker,然后按照你的協(xié)議約定個格式,發(fā)送數(shù)據(jù)。
比如格式為 {"type":"send_to_client", "client":"clientA", "content":"blabla..."},$app收到這個格式的數(shù)據(jù),就知道是給clientA發(fā)送數(shù)據(jù)"balbal...",然后找到clientA的connection 發(fā)送即可
$app worker這邊收到數(shù)據(jù)后,$app這邊怎么找到ClientA..C。因?yàn)檫@里是worker->onMessage(TcpConnection $conn, $data)
{
}
給你個代碼片段
$app = new Worker('websocket://0.0.0.0:8484');
$app->onMessage = function($connection, $data){
global $conn_array;
// 假設(shè)data中傳遞了uid
$uid = $data;
// 這樣就把uid到connection的關(guān)系映射起來了
$conn_array = $connection;
};
// 給某個uid推送
function send_to_uid($uid, $data)
{
global $conn_array;
$conn_array->send($data);
}
// 廣播
function broadcast($data)
{
global $conn_array;
foreach($conn_array as $con)
{
$con->send($data);
}
}