मैं एक वेब अनुप्रयोग जहाँ मैं इस परिदृश्य के लिए वास्तविक समय व्यवहार की जरूरत है विकसित करने हूँ प्रकाशित करते हैं,पीएचपी 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();
तो, सवाल वास्तव में क्या है? – Epodax
पहला, -1 जिस तरह से सवाल पूछा गया था (आप यहां लोगों को भर्ती नहीं कर रहे हैं)। दूसरा। मैं देखता हूं कि आप ऑटोबहन के दो अलग-अलग संस्करणों (WAMP v1 को लागू करने वाला संस्करण और WAMP v2 का उपयोग करने वाले संस्करण) से दो अलग-अलग वाक्यविन्यासों का उपयोग कर रहे हैं। AFAIK, रत्शेट में WAMPServer क्लास द्वारा संचालित पबसब पैटर्न केवल WAMP v1 के साथ संगत है और इसलिए आपको केवल लीगेसी AutobahnJS का उपयोग करना चाहिए। वापस आ जाएगा क्योंकि मैं सदस्यता को लागू करने के तरीके के बारे में भी संदिग्ध हूं। –
@whitelettersinblankpapers मैंने सदस्यता के लिए अन्य वाक्यविन्यास का उपयोग करने की कोशिश की और परिणाम कोई अलग नहीं है। कृपया अद्यतन प्रश्न की जांच करें –