2012-10-13 42 views
15

Tôi muốn sử dụng một Ratchet (http://socketo.me) để kết nối vĩnh viễn giữa Ứng dụng iPhone và Máy chủ. Và tôi cần trao đổi dữ liệu giữa các ứng dụng và máy chủ.Máy chủ Ratchet WebSocket có thể gửi tin nhắn cho khách hàng không?

Từ ví dụ này (http://socketo.me/docs/hello-world) Tôi đã phát hiện ra rằng mình có chức năng onMessage sẽ được gọi khi ứng dụng gửi massage đến máy chủ và máy chủ có thể gửi phản hồi cho ứng dụng.

Nhưng máy chủ cũng phải có khả năng gửi dữ liệu đến ứng dụng mà không nhận dữ liệu từ ứng dụng. Ví dụ: kết nối giữa ứng dụng và máy chủ đã được thiết lập. Đã xảy ra sự cố trên máy chủ và chúng tôi cần gửi dữ liệu mới đến ứng dụng. Làm thế nào tôi có thể làm điều đó và là nó có thể?

Câu hỏi chính là làm cách nào để gửi dữ liệu đến Ứng dụng từ máy chủ?

Cảm ơn bạn đã được trợ giúp.

Trả lời

12

Điều đó thực sự có thể xảy ra. Bạn cần phải giao tiếp với quá trình máy chủ WebSocket bằng cách nào đó. Bạn có thể làm điều đó bằng cách sử dụng một số hình thức thông điệp đi qua, có thể là RPC hoặc một hàng đợi tin nhắn.

Bản thân Ratchet dựa trên vòng lặp Sự kiện phản ứng. Điều này có nghĩa rằng bất kỳ hình thức giao tiếp với Ratchet phải được tích hợp với vòng lặp sự kiện đó. On the React homepage bạn có thể xem một số tích hợp đã tồn tại:

  • Predis/Async (bạn có thể sử dụng redis pub/sub cho tin nhắn qua)
  • DNode-PHP (dnode là dựa trên giao thức RPC TCP)
  • React/ZMQ (tích hợp vòng lặp sự kiện với ZeroMQ)
  • React/Stomp (thực hiện của giao thức STOMP, cho phép bạn nói chuyện với một thông điệp như RabbitMQ)
  • JCook21/ReactAMQP (Các ràng buộc AMQP cho React PHP)

Trong tài liệu Ratchet có a tutorial on how to use React/ZMQ để đẩy thư từ bất kỳ đâu đến máy chủ WebSocket của bạn.

+0

Cảm ơn bạn đã trợ giúp. – lexa

+1

Ví dụ tốt cho React/ZMQ.Nhưng tôi không thể tìm hiểu làm thế nào tôi có thể đẩy dữ liệu thích hợp (ví dụ, một json đặc biệt tôi đã tạo) cho người dùng thích hợp. Ví dụ, tôi phải gửi dữ liệu cho người dùng thích hợp (tôi có danh sách id người dùng). Điều này có cần thiết mà người dùng đã được đăng ký với 'trang cụ thể' (như họ nói ở đây: http://socketo.me/docs/push)? – lexa

+0

igorw, đám mây chúng ta được kết nối bằng cách nào đó (skype, cho exmaple) để đặt câu hỏi trực tiếp cho bạn. Và cảm ơn sự giúp đỡ của bạn. – lexa

6

Ratchet cũng thực hiện WAMP, bao gồm PubSub. Vì vậy, khách hàng của bạn có thể đăng ký một số chủ đề và bạn có thể có các ứng dụng khách khác (hoạt động trên cơ sở hạ tầng phụ trợ của bạn) xuất bản cho các chủ đề đó. Bạn có thể có một AutobahnPython dựa trên xuất bản khách hàng thông qua Ratchet cho một ứng dụng di động dựa trên AutobahnAndroid hoặc AutobahnJS dựa trên HTML5 khách hàng.

+0

nó sử dụng wampv1 và iOS không có thư viện cho v1. Có cách nào để đẩy bằng giao diện MessageComponent không? –

+0

Thruway hỗ trợ WAMPv2 https://github.com/voryx/Thruway, vì vậy bạn có thể sử dụng https://github.com/mogui/MDWamp với nó – oberstet

0

Tôi có cùng một câu hỏi và đây là những gì tôi đã làm.

Dựa trên hello world tutorial, tôi đã thay thế SplObjectStorage bằng một mảng. Trước khi trình bày các sửa đổi của tôi, tôi muốn bình luận rằng nếu bạn làm theo hướng dẫn đó và hiểu nó, điều duy nhất ngăn bạn tự mình đến giải pháp này có lẽ không biết SplObjectStorage là gì.

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(); 
    } 
} 

Tất nhiên để làm cho nó thực sự hữu ích bạn cũng có thể muốn thêm vào kết nối DB và lưu trữ/truy xuất các tài nguyên đó.

+0

Hoạt động tuyệt vời !! Cảm ơn bạn !!! – iYonatan

+1

Hoạt động tuyệt vời! nhưng điều này hoạt động giống như ack, một khi máy chủ nhận được một tin nhắn bạn gửi một tin nhắn cho khách hàng. Làm thế nào để tôi gửi (bắt đầu) một tin nhắn cho khách hàng mà không nhận được một tin nhắn từ khách hàng – nepsdotin

Các vấn đề liên quan