2015-11-03 5 views
6

मैं एक वेब अनुप्रयोग जहाँ मैं इस परिदृश्य के लिए वास्तविक समय व्यवहार की जरूरत है विकसित करने हूँ प्रकाशित करते हैं,पीएचपी Ratchet Wamp प्रसारण ग्राहकों के लिए पर घटना

आवेदन उपयोगकर्ताओं Player और Spectator के दो प्रकार होगा। खिलाड़ी एक जा रहे गेम में शामिल हो सकते हैं जबकि दर्शक केवल देख सकते हैं।

एक गेम एक व्यवस्थापक उपयोगकर्ता द्वारा शुरू किया जाएगा।

एक दर्शक मूल रूप से है जो लोगों की सूची देख सकता है जो एक गेम में शामिल हो गए हैं। निस्संदेह यह वास्तविक समय का अर्थ होना चाहिए जब कोई खिलाड़ी डिस्कनेक्ट हो जाता है या कोई नया खिलाड़ी गेम दर्शक में शामिल होता है तो वास्तविक समय सूची देखता है।

संक्षेप में, ध्यान में रखते हुए नीचे दिए गए उदाहरण

Spectator_1 joins Clan_101 
Spectator_2 joins Clan_201 

Player_1 joins Clan_101 // Need to broadcast this event to Spectator_1 
Player_2 joins Clan_101 // Need to broadcast this event to Spectator_1 
Player_1 disconnects Clan_101 // // Need to broadcast this event to Spectator_1 

Player_11 joins Clan_201 // Need to broadcast this event to Spectator_2 
Player_12 joins Clan_201 // // Need to broadcast this event to Spectator_2 

पर विचार एक चालू एक विषय/चैनल (Ratchet\Wamp\Topic) के रूप में खेल, मैं निम्न इवेंट player join और player left खेल के लिए पर दर्शकों के लिए प्रसारित करने की जरूरत है/जिस विषय पर दर्शकों ने सदस्यता ली है।

मैं सर्वर साइड पर Ratchet WebSockets for PHP और autobahn js उपयोग कर रहा हूँ ग्राहक के पक्ष

नीचे पर कोड है। जहां तक ​​कोई खिलाड़ी किसी गेम में शामिल/डिस्कनेक्ट करता है, तब तक मैं सर्वर (क्लाइंट से) को जानकारी भेजने में सक्षम हूं। लेकिन जब कोई खिलाड़ी जुड़ता है या डिस्कनेक्ट करता है तो मैं इस जानकारी को दर्शक (क्लाइंट एंड) पर कैसे प्रसारित करूं?

player.html

<script src="scripts/autobahn.js" type="text/javascript"></script> 
<script src="scripts/jquery-1.11.2.min.js" type="text/javascript"></script> 
<script> 
ab.connect(
    'ws://localhost:8080', 
    function (session) { 
     appSession = session; 
     $('#btnJoinGame').on('click',function(){ 
     session.publish('joingame', ['data','GAME_ID']); 
    });     
}); 
</script> 

spectator.html

<script> 
var conn = new ab.Session(
    'ws://localhost:8080', 
    function() {    
     conn.subscribe('spectator_GAME_ID', function(topic, data) { 
      console.log(topic); 
      console.log(data); 
     }); 
    }, 
    function() {    
     console.warn('WebSocket connection closed'); 
    }  
); 
/* OR Using the legacy syntax */ 
/* 
    ab.connect(
     'ws://localhost:8080', 
      function (session) { 
       session.subscribe("t1011", function (topic, event) { 
        console.log(event); 
       }); 
      }      
    ); 
*/ 
</script> 

Server.php

require __DIR__ . '/vendor/autoload.php'; 

use Ratchet\Wamp\WampServerInterface; 
use Ratchet\MessageComponentInterface; 
use Ratchet\ConnectionInterface as Conn; 


class EventHandler implements WampServerInterface, MessageComponentInterface{ 
    public function __construct(React\EventLoop\StreamSelectLoop $loop){ 
     $this->loop = $loop; 
    } 
    public function onSubscribe(Conn $conn, $subscription, $params = array()){ 
     $subscription->broadcast($this->data); 
    } 

    public function onPublish(Conn $conn, $topic, $params, array $exclude, array $eligible) { 
     if($topic->getId() === 'joingame'){ 
      if(!isset($this->data[$params[1]])){ 
       $this->data[$params[1]] = array($params[0]); 
      }else{ 
       array_push($this->data[$params[1]], $params[0]); 
      }    
     } 
     /** DOES'NT WORKS **/ 
     $newtopic = new Ratchet\Wamp\Topic('spectator_GAME_ID'); 
     $this->onSubscribe($conn,$newtopic); 
    } 
    /*Omitting other methods for brevity*/ 
} 

$loop = React\EventLoop\Factory::create(); 

$webSock = new React\Socket\Server($loop); 
$webSock->listen(8080, '0.0.0.0'); // Binding to 0.0.0.0 means remotes can connect 
new Ratchet\Server\IoServer(
    new Ratchet\Http\HttpServer( 
     new Ratchet\WebSocket\WsServer(
      new Ratchet\Wamp\WampServer(
       new EventHandler($loop) // This is my class. Pass in the loop! 
      ) 
     ) 
    ), 
    $webSock 
); 

$loop->run(); 
+0

तो, सवाल वास्तव में क्या है? – Epodax

+0

पहला, -1 जिस तरह से सवाल पूछा गया था (आप यहां लोगों को भर्ती नहीं कर रहे हैं)। दूसरा। मैं देखता हूं कि आप ऑटोबहन के दो अलग-अलग संस्करणों (WAMP v1 को लागू करने वाला संस्करण और WAMP v2 का उपयोग करने वाले संस्करण) से दो अलग-अलग वाक्यविन्यासों का उपयोग कर रहे हैं। AFAIK, रत्शेट में WAMPServer क्लास द्वारा संचालित पबसब पैटर्न केवल WAMP v1 के साथ संगत है और इसलिए आपको केवल लीगेसी AutobahnJS का उपयोग करना चाहिए। वापस आ जाएगा क्योंकि मैं सदस्यता को लागू करने के तरीके के बारे में भी संदिग्ध हूं। –

+0

@whitelettersinblankpapers मैंने सदस्यता के लिए अन्य वाक्यविन्यास का उपयोग करने की कोशिश की और परिणाम कोई अलग नहीं है। कृपया अद्यतन प्रश्न की जांच करें –

उत्तर

1

इस सब से पहले जवाब शायद आपके लिए बहुत देर हो चुकी है हालांकि मैं इसे रिकॉर्ड के लिए उत्तर दूंगा।

एक बार जब आप अपने आवेदन में कई चैनलों की स्थापना की है:

आप जो खेल है कि आप देख रहे हैं खेल रहा है देखने के लिए सक्षम होना चाहता हूँ spectator_GAME_ID। और वेबस्केट का उपयोग करने का कारण यह है कि आप रीयलटाइम परिवर्तन देख सकते हैं।

आपको सबसे पहले यह समझना होगा कि विषय सभी अलग-अलग चैनल/गेम आईडी हैं।

एक बार जब आप इसका एहसास कर लें और कोडेट का उदाहरण पृष्ठ पर उपलब्ध कराए गए कोड का उपयोग करें।

$entryData = json_decode($entry, true); 

    // If the lookup topic object isn't set there is no one to publish to 
    if (!array_key_exists($entryData['category'], $this->subscribedTopics)) { 
     return; 
    } 

    $topic = $this->subscribedTopics[$entryData['category']]; 

    // re-send the data to all the clients subscribed to that category 
    $topic->broadcast($entryData); 

उनके उदाहरण में वे अपने JSON स्ट्रिंग में श्रेणियों का उपयोग करते हैं, तो आप शायद इसे गेम आईडी में बदल देंगे।

एक बार आपके पास यह जगह हो जाने के बाद आप केवल एक निश्चित गेम आईडी सुनने वाले लोगों को डेटा भेज सकेंगे।


आपके प्रश्न का दूसरा भाग उन्हें अपडेट भेजना था और अपडेट कैसे करना है।

सबसे आसान तरीका है JSON obejct कि भेजा जा रहा है

{ 
    "action": "join", 
    "gameId": "123",     //so that you know to which game to publish it 
    "userIdThatJoined": "123456789", //whatever other data you need 
    "userNameThatJoined": "Foo Bar" 
} 

एक बार यह भेजा जाता है आप अगर कार्रवाई 'में शामिल होने के' है, clientside पर इसे प्राप्त करने और कार्रवाई के लिए जांच होनी चाहिए के लिए एक स्ट्रिंग जोड़कर है फिर उस उपयोगकर्ता को अपना नाम कुछ सूची में जोड़ें। यदि कार्रवाई 'छोड़ें' है तो उस उपयोगकर्ता को उसका नाम सूची से हटा दें।

आप सक्रिय प्रदर्शन खिलाड़ियों की सूची में अपने प्रदर्शन को अद्यतन के बाद बुलाए जाने वाले कुछ फ़ंक्शन के साथ अपडेट कर सकते हैं या कोणीय से सरल एनजी-दोहराने का उपयोग कर सकते हैं और फिर केवल नए मान लागू कर सकते हैं।

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