現(xiàn)狀:
1.通用workerman的socket提供安卓和IOS進行聊天。
2.網(wǎng)頁端目前看來只能用websocket。
希望解決的問題:
是否可以有個什么辦法。譬如中轉(zhuǎn)服務(wù),把socket和websocket的信息進行互相轉(zhuǎn)發(fā),或是還有提供更好的辦法,麻煩給指個方向 ,謝謝了。
在Event.php中實現(xiàn)onGatewayMessage,使之支持雙協(xié)議,方法就是通過協(xié)議的特點區(qū)分是哪種協(xié)議
由于和IOS通訊的協(xié)議是自己訂制的,可以根據(jù)訂制協(xié)議的特點比如協(xié)議是 json+回車 ,那么首字符應(yīng)該是'{'(也可能是[,這里只是舉個例子),而websocket協(xié)議首部第一個字節(jié)肯定不是'{‘,所以就可以通過首部這個字節(jié)來區(qū)分是IOS的協(xié)議還是websocket。當(dāng)然你可以用其它方法區(qū)分協(xié)議。
public static function onGatewayMessage($buffer)
{
// 假如首部字節(jié)區(qū)分協(xié)議
if($buffer=='{')
{
// IOS的協(xié)議
return yourIOSProtocol::check($buffer);
}
// websocket的協(xié)議
return WebSocket::check($buffer);
}
這樣在Gateway層面上就能支持雙協(xié)議了。
接下來還需要在Event::onConnect(如果版本小于2.1.3有的話) Event::onMessage上區(qū)分協(xié)議,方法類似,通過首部第一個字節(jié)
public static function onMessage($client_id, $buffer)
{
// 假如首部字節(jié)區(qū)分協(xié)議
if($buffer=='{')
{
// IOS的協(xié)議
$protocol = 'IOS';
$message = yourIOSProtocol::decode($buffer);
}
else
{
// websocket的協(xié)議
$protocol = 'websocket';
$message = WebSocket::decode($buffer);
}
// 當(dāng)客戶端第一次發(fā)來數(shù)據(jù)時,需要根據(jù)協(xié)議存儲客戶端列表,IOS協(xié)議一組,WebSocket一組
if(!isset($_SESSION))
{
// 保存session說明已經(jīng)將該client_id寫到對應(yīng)協(xié)議的client列表中了
$_SESSION = $protocol;
// 將client_id寫入到對應(yīng)協(xié)議的客戶端列表
your_group_add_fun($protocol , $client);
// 保存這個client的協(xié)議到集中存儲(例如memcache)中,以便私聊時用對應(yīng)的協(xié)議給它發(fā)送數(shù)據(jù)
your_store_client_protocol($client_id, $protocol);
}
// **_廣播消息**_
$new_message = "XXXXXXXXXXXXXXXXXX";
// 獲取IOS客戶端列表
$ios_client_id_array = your_get_client_array_func('IOS');
// 以IOS的協(xié)議向IOS客戶端發(fā)送數(shù)據(jù)
Gateway::sendToAll(yourIOSProtocol::encode($new_message), $ios_client_id_array);
// 獲取websocket客戶端列表
$ws_client_id_array = your_get_client_array_func('WEBSOCKET');
// 以websocket協(xié)議向websocket客戶端發(fā)送數(shù)據(jù)
Gateway::sendToAll(Websocket::encode($new_message), $websocket_client_id_array);
// _ 私聊 _
$client_id_to_send = $message;
$protocol = your_get_client_protocol($client_id_to_send);
if(‘IOS’ == $protocol)
{
$new_message = yourIOSProtocol::encode($new_message);
}
else
{
$new_message = Websocket::encode($new_message);
}
// 2.1.2版本為Gateway::sendToUid($client_id_to_send, $new_message);
Gateway::sendToClient($client_id_to_send, $new_message);
}
兩種協(xié)議互相聊天的實現(xiàn)大概如上所述
發(fā)送心跳數(shù)據(jù)也要分協(xié)議判斷,這種情況下應(yīng)該是兩種格式的ping.data ,但在配置中是一個,感覺應(yīng)該設(shè)置多個,然后在發(fā)送心跳數(shù)據(jù)是也需要判斷協(xié)議,根據(jù)不同的協(xié)議發(fā)送不同的ping.data。。