項(xiàng)目和gatewayworker服務(wù)是獨(dú)立部署的,在同一個(gè)服務(wù)器上,GatewayWorker不接受客戶端發(fā)來(lái)的數(shù)據(jù),即GatewayWorker不處理任何業(yè)務(wù)邏輯,GatewayWorker僅僅當(dāng)做一個(gè)單向的推送通道。
僅當(dāng)項(xiàng)目需要向?yàn)g覽器主動(dòng)推送數(shù)據(jù)時(shí)才在項(xiàng)目中調(diào)用Gateway的API GatewayClient完成推送。
問(wèn)題:
客戶端websocket連接成功了,服務(wù)端執(zhí)行接口Gateway::sendToAll,客戶端也能接收到消息,但是連接成功時(shí),接收不到client_id,日志里Events.php中的onConnect方法沒(méi)有執(zhí)行
<script type="text/javascript">
/**
* 與GatewayWorker建立websocket連接,域名和端口改為你實(shí)際的域名端口,
* 其中端口為Gateway端口,即start_gateway.php指定的端口。
* start_gateway.php 中需要指定websocket協(xié)議,像這樣
* $gateway = new Gateway(websocket://0.0.0.0:7272);
*/
ws = new WebSocket("wss://websocket.baoxiaoban.com/wss");
ws.onopen = function(event) {
alert("連接成功");
};
// 服務(wù)端主動(dòng)推送消息時(shí)會(huì)觸發(fā)這里的onmessage
ws.onmessage = function(e){
alert(e.data);
var data = JSON.parse(e.data);
var type = data.type || '';
switch(type){
case 'init':
// 存儲(chǔ)client_id
alert(data.client_id);
clientId = data.client_id;
// 可以在這里將client_id發(fā)送到服務(wù)器進(jìn)行綁定或其他操作
break;
case 'message':
alert(data.text);
// 其他消息處理
}
};
</script>
Events.php代碼:
class Events
{
/**
* 當(dāng)客戶端連接時(shí)觸發(fā)
* 如果業(yè)務(wù)不需此回調(diào)可以刪除onConnect
*
* @param int $client_id 連接id
*/
public static function onConnect($client_id)
{
Gateway::sendToClient($client_id, json_encode(array(
'type' => 'init',
'client_id' => $client_id
)));
}
/**
* 當(dāng)客戶端發(fā)來(lái)消息時(shí)觸發(fā)
* @param int $client_id 連接id
* @param mixed $message 具體消息
*/
public static function onMessage($client_id, $message)
{
// 向所有人發(fā)送
//Gateway::sendToAll("nihao");
}
Ubuntu 22.0,gatewayworker最新版本