2012-10-13 13 views
15

मैं आईफोन ऐप्स और सर्वर के बीच स्थायी कनेक्शन के लिए एक रैचेट (http://socketo.me) का उपयोग करना चाहता हूं। और मुझे ऐप्स और सर्वर के बीच डेटा का आदान-प्रदान करने की आवश्यकता है।क्या रैचेट वेबस्केट सर्वर क्लाइंट को संदेश भेज सकता है?

इस उदाहरण (http://socketo.me/docs/hello-world) मुझे पता चला है कि मैं एक समारोह है onMessage कि जब अनुप्रयोग सर्वर के लिए एक मालिश भेजने के नाम से जाना जाएगा और सर्वर अनुप्रयोग के लिए एक प्रतिक्रिया भेज सकता से।

लेकिन सर्वर में ऐप से डेटा प्राप्त किए बिना ऐप में डेटा भेजने की क्षमता भी होनी चाहिए। उदाहरण के लिए, ऐप और सर्वर के बीच कनेक्शन स्थापित किया गया है। सर्वर पर कुछ हुआ और हमें ऐप में एक नया डेटा भेजने की जरूरत है। मैं यह कैसे कर सकता हूं और क्या यह संभव है?

मुख्य प्रश्न यह है कि मैं सर्वर से ऐप को डेटा कैसे भेज सकता हूं?

किसी भी मदद के लिए धन्यवाद।

उत्तर

12

यह वास्तव में संभव है। आपको किसी भी तरह WebSocket सर्वर प्रक्रिया के साथ संवाद करने की आवश्यकता है। आप संदेश के कुछ रूपों का उपयोग करके ऐसा कर सकते हैं, चाहे वह आरपीसी हो या संदेश कतार हो।

रैचेट स्वयं रिएक्ट इवेंट लूप पर आधारित है। इसका मतलब है कि रैचेट के साथ संचार का कोई भी रूप उस घटना लूप के साथ एकीकृत होना चाहिए।

  • Predis/Async
  • DNode-PHP (dnode एक टीसीपी आधारित RPC प्रोटोकॉल है)
  • React/ZMQ (जुड़ता है (आप संदेश पारित करने के लिए redis पब/उप उपयोग कर सकते हैं): On the React homepage आप एकीकरण कि पहले से ही मौजूद के कुछ देख सकते हैं ZeroMQ के साथ घटना पाश)
  • React/Stomp (STOMP प्रोटोकॉल के कार्यान्वयन, आप)
  • ऐसे RabbitMQ के रूप में संदेश के लिए बात करने की अनुमति 863,210 (PHP प्रतिक्रिया के लिए AMQP बाइंडिंग)
के लिए अपने WebSocket सर्वर से कहीं से भी संदेशों को पुश करने में

Ratchet प्रलेखन में a tutorial on how to use React/ZMQ है।

+0

सहायता के लिए धन्यवाद। – lexa

+1

प्रतिक्रिया/ZMQ के लिए अच्छा उदाहरण।लेकिन मैं यह नहीं समझ सकता कि मैं उचित उपयोगकर्ता को उचित डेटा कैसे धक्का दे सकता हूं (उदाहरण के लिए, मैंने बनाया एक विशेष जेसन)। उदाहरण के लिए, मुझे उचित उपयोगकर्ताओं को डेटा भेजना है (मेरे पास उपयोगकर्ता की आईडी की सूचियां हैं)। क्या यह आवश्यक है कि उपयोगकर्ता पहले से ही 'विशिष्ट पृष्ठ' की सदस्यता ले चुका है (जैसे वे यहां कहते हैं: http://socketo.me/docs/push)? – lexa

+0

igorw, क्लाउड हम आपको सीधे एक प्रश्न पूछने के लिए किसी भी तरह से जुड़े हुए हैं (स्काइप, exmaple के लिए)। और आपकी मदद के लिए धन्यवाद। – lexa

6

रैचेट WAMP लागू करता है, जिसमें पबसब शामिल है। तो आपके ग्राहक कुछ विषयों की सदस्यता ले सकते हैं, और आपके पास अन्य विषयों (आपके बैकएंड आधारभूत संरचना पर चल रहे हैं) उन विषयों पर प्रकाशित हो सकते हैं। आप या तो एक ऑटोबहन एंड्रॉइड आधारित मोबाइल ऐप या AutobahnJS आधारित HTML5 क्लाइंट के लिए रैकेट के माध्यम से एक AutobahnPython आधारित क्लाइंट प्रकाशन कर सकते हैं।

+0

यह wampv1 का उपयोग करता है, और आईओएस में v1 के लिए लाइब्रेरी नहीं है। क्या संदेशकंपोनेंट इंटरफेस का उपयोग करके धक्का देने का कोई तरीका है? –

+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

महान काम करता है! लेकिन सर्वर को एक संदेश मिलने के बाद, आप क्लाइंट को एक संदेश भेजते हैं, यह एके की तरह काम करता है। क्लाइंट से संदेश प्राप्त किए बिना मैं क्लाइंट को एक संदेश कैसे भेजूं (आरंभ) करता हूं – nepsdotin

संबंधित मुद्दे