2012-10-13 116 views
15

我想使用棘輪(http://socketo.me)在iPhone應用程序和服務器之間進行永久連接。我需要在應用程序和服務器之間交換數據。棘輪WebSocket服務器可以向客戶端發送消息嗎?

從這個例子(http://socketo.me/docs/hello-world),我發現我有一個函數的onMessage當應用程序發送按摩到服務器將被調用,服務器可以發送到應用程序的響應。

但是服務器還必須有能力發送數據到應用程序,而無需從應用程序獲取數據。例如,應用程序和服務器之間的連接已經建立。服務器發生某些事情,我們需要嚮應用發送新數據。我該怎麼做,這有可能嗎?

主要問題是如何從服務器發送數據到應用程序?

謝謝你的幫助。

回答

12

這確實是可能的。您需要以某種方式與WebSocket服務器進程通信。您可以通過使用某種形式的消息傳遞來完成此操作,無論是RPC還是消息隊列。

棘輪本身基於React事件循環。這意味着與Ratchet的任何形式的通信都必須與該事件循環集成。 On the React homepage你可以看到一些已經存在的集成的:

在棘輪文檔有a tutorial on how to use React/ZMQ,以推動從任何地方郵件到您的WebSocket服務器。

+0

謝謝你的幫助。 – lexa

+1

React/ZMQ的好例子。但是我找不到如何將正確的數據(例如,我創建的特殊JSON)推送給適當的用戶。例如,我必須將數據發送給適當的用戶(我有用戶標識的列表)。這是必要的,用戶已經訂閱了'特定頁面'(就像他們在這裏說的:http://socketo.me/docs/push)? – lexa

+0

igorw,我們要以某種方式連接雲(skype,例如)直接向您提出問題。並感謝您的幫助。 – lexa

6

棘輪還實施WAMP,其中包括PubSub。因此,您的客戶可以訂閱一些主題,並且可以讓其他客戶端(即在您的後端基礎結構上運行)發佈到這些主題。您可以將基於AutobahnPython的客戶端通過Ratchet發佈到基於AutobahnAndroid的移動應用程序或基於AutobahnJS的HTML5客戶端。

+0

它使用wampv1,iOS沒有v1的庫。 有沒有辦法使用MessageComponent接口進行推送? –

+0

高速公路支持WAMPv2 https://github.com/voryx/Thruway,所以你應該能夠使用它https://github.com/mogui/MDWamp – oberstet

0

我有完全相同的問題,這就是我所做的。

基於hello world tutorial,我用一個數組替換了SplObjectStorage。在介紹我的修改之前,我想評論一下,如果你通過該教程並理解它,唯一阻止你自己到達此解決方案的事情可能不知道SplObjectStorage是什麼。

class Chat implements MessageComponentInterface { 
    protected $clients; 

    public function __construct() { 
     $this->clients = array(); 
    } 

    public function onOpen(ConnectionInterface $conn) { 
     // Store the new connection to send messages to later 
     $this->clients[$conn->resourceId] = $conn; 
     echo "New connection! ({$conn->resourceId})\n"; 
    } 

    public function onMessage(ConnectionInterface $from, $msg) { 
     $numRecv = count($this->clients) - 1; 
     echo sprintf('Connection %d sending message "%s" to %d other connection%s' . "\n" 
      , $from->resourceId, $msg, $numRecv, $numRecv == 1 ? '' : 's'); 

     foreach ($this->clients as $key => $client) { 
      if ($from !== $client) { 
       // The sender is not the receiver, send to each client connected 
       $client->send($msg); 
      } 
     } 
     // Send a message to a known resourceId (in this example the sender) 
     $client = $this->clients[$from->resourceId]; 
     $client->send("Message successfully sent to $numRecv users."); 
    } 

    public function onClose(ConnectionInterface $conn) { 
     // The connection is closed, remove it, as we can no longer send it messages 
     unset($this->clients[$conn->resourceId]); 

     echo "Connection {$conn->resourceId} has disconnected\n"; 
    } 

    public function onError(ConnectionInterface $conn, \Exception $e) { 
     echo "An error has occurred: {$e->getMessage()}\n"; 

     $conn->close(); 
    } 
} 

當然,爲了使它非常有用,您可能還想添加數據庫連接,並存儲/檢索這些resourceIds。

+0

令人驚歎! 謝謝!!! – iYonatan

+1

非常棒!但是這樣的工作有點像ack,一旦服務器收到你發送消息給客戶端的消息。我如何向客戶端發送(啓動)消息而不從客戶端收到消息 – nepsdotin

相關問題