你可以嘗試:
在WebSocket事件如message的回撥函數里用$serv->send($fd_tcp, $json)傳送訊息給TCP連線.
在TCP事件如receive的回撥函數里用$serv->push($fd_ws, $json)推送訊息給WebSocket連線.
上述操作在單機上可能可行,但在多機分散式上不可用.
所以可以考慮使用一箇中間件作為跨伺服器/跨協議通訊的介質.
比如Redis提供的PubSub訊息釋出訂閱功能就是一個簡單易用的訊息傳遞的中介軟體.
工作流程如下:
WebSocket連線建立時,用Swoole內建的Redis客戶端非同步訂閱(subscribe)一個頻道,頻道名為:
swoole:user:1:channel
其中1表示連線所屬的使用者編號(保證唯一).
TCP連線建立時,同樣也用Swoole內建的Redis客戶端非同步訂閱(subscribe)一個頻道,頻道名為:
swoole:user:2:channel
兩個不同協議的連線通訊時,就是釋出(publish)資訊到指定頻道:
$swoole_redis->publish($user_channel, $json);
而處理收到資訊的邏輯則寫在訂閱(subscribe)操作的回撥函式message裡.
你可以嘗試:
在WebSocket事件如message的回撥函數里用$serv->send($fd_tcp, $json)傳送訊息給TCP連線.
在TCP事件如receive的回撥函數里用$serv->push($fd_ws, $json)推送訊息給WebSocket連線.
上述操作在單機上可能可行,但在多機分散式上不可用.
所以可以考慮使用一箇中間件作為跨伺服器/跨協議通訊的介質.
比如Redis提供的PubSub訊息釋出訂閱功能就是一個簡單易用的訊息傳遞的中介軟體.
工作流程如下:
WebSocket連線建立時,用Swoole內建的Redis客戶端非同步訂閱(subscribe)一個頻道,頻道名為:
swoole:user:1:channel
其中1表示連線所屬的使用者編號(保證唯一).
TCP連線建立時,同樣也用Swoole內建的Redis客戶端非同步訂閱(subscribe)一個頻道,頻道名為:
swoole:user:2:channel
兩個不同協議的連線通訊時,就是釋出(publish)資訊到指定頻道:
$swoole_redis->publish($user_channel, $json);
而處理收到資訊的邏輯則寫在訂閱(subscribe)操作的回撥函式message裡.