Tôi đang phát triển một ứng dụng web mà tôi cần phải hành vi thời gian thực cho các tình huống sau,PHP Ratchet WAMP Broadcast cho thuê bao trên công bố sự kiện
ứng dụng sẽ có hai loại người dùng Player
và Spectator
. Người chơi có thể tham gia trò chơi đang diễn ra trong khi Người xem chỉ có thể tham gia trò chơi.
Trò chơi sẽ được người dùng quản trị khởi tạo.
Khán giả về cơ bản là ai đó người có thể xem danh sách người đã tham gia trò chơi. Tất nhiên điều này cần phải có ý nghĩa thời gian thực khi người chơi ngắt kết nối hoặc một người chơi mới tham gia vào một khán giả trò chơi sẽ thấy danh sách thời gian thực.
Để tóm tắt, hãy xem xét ví dụ dưới đây
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
Xét một trên-đi trò chơi như một chủ đề/kênh (Ratchet\Wamp\Topic
), tôi cần phải phát sóng để khán giả trên các sự kiện sau player join
và player left
vào trò chơi/chủ đề mà khán giả đã đăng ký.
Tôi đang sử dụng Ratchet WebSockets for PHP về phía máy chủ và autobahn js về phía khách hàng
Dưới đây là các mã. Cho đến nay tôi có thể gửi thông tin đến máy chủ (từ máy khách) khi người chơi tham gia/ngắt kết nối trò chơi. Nhưng Làm cách nào để phát sóng thông tin này đến khán giả (kết thúc của máy khách) khi người chơi tham gia hoặc ngắt kết nối.
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();
Vì vậy, câu hỏi chính xác là gì? – Epodax
Đầu tiên, -1 cho câu hỏi được hỏi (Bạn không thuê người ở đây). Thứ hai. Tôi thấy rằng bạn đang sử dụng hai cú pháp khác nhau từ hai phiên bản khác nhau của Autobahn (phiên bản triển khai WAMP v1 và phiên bản sử dụng WAMP v2). AFAIK, Mẫu PubSub được xử lý bởi lớp WAMPServer trong Ratchet chỉ tương thích với WAMP v1 và vì vậy bạn chỉ nên sử dụng Legacy AutobahnJS. Sẽ trở lại vì tôi cũng nghi ngờ về cách bạn triển khai đăng ký. –
@whitelettersinblankpapers Tôi đã cố gắng sử dụng cú pháp khác để đăng ký và kết quả là không khác nhau. vui lòng kiểm tra câu hỏi được cập nhật –