项目和gatewayworker服务是独立部署的,在同一个服务器上,GatewayWorker不接受客户端发来的数据,即GatewayWorker不处理任何业务逻辑,GatewayWorker仅仅当做一个单向的推送通道。
仅当项目需要向浏览器主动推送数据时才在项目中调用Gateway的API GatewayClient完成推送。
问题:
客户端websocket连接成功了,服务端执行接口Gateway::sendToAll,客户端也能接收到消息,但是连接成功时,接收不到client_id,日志里Events.php中的onConnect方法没有执行
<script type="text/javascript">
/**
* 与GatewayWorker建立websocket连接,域名和端口改为你实际的域名端口,
* 其中端口为Gateway端口,即start_gateway.php指定的端口。
* start_gateway.php 中需要指定websocket协议,像这样
* $gateway = new Gateway(websocket://0.0.0.0:7272);
*/
ws = new WebSocket("wss://websocket.baoxiaoban.com/wss");
ws.onopen = function(event) {
alert("连接成功");
};
// 服务端主动推送消息时会触发这里的onmessage
ws.onmessage = function(e){
alert(e.data);
var data = JSON.parse(e.data);
var type = data.type || '';
switch(type){
case 'init':
// 存储client_id
alert(data.client_id);
clientId = data.client_id;
// 可以在这里将client_id发送到服务器进行绑定或其他操作
break;
case 'message':
alert(data.text);
// 其他消息处理
}
};
</script>
Events.php代码:
class Events
{
/**
* 当客户端连接时触发
* 如果业务不需此回调可以删除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
)));
}
/**
* 当客户端发来消息时触发
* @param int $client_id 连接id
* @param mixed $message 具体消息
*/
public static function onMessage($client_id, $message)
{
// 向所有人发送
//Gateway::sendToAll("nihao");
}
Ubuntu 22.0,gatewayworker最新版本