2017-09-11 59 views
1

我正在使用socket_write來打開websocket並將數據傳遞給node.js socket.io服務器。我送HTML的位,如下所示:通過socket_io傳遞socket.io空間?

private function openSocketConnection($address = 'localhost', $port = 5600) 
{ 
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 
    socket_connect($socket, $address, $port); 

    return $socket; 
} 

$socket = $this->openSocketConnection(); 

socket_write($socket, $html, strlen($html)); 

這工作完全正常,我的數據發送到我的node.js socket.io服務器,我抓住它,像這樣:

socket.on('data', (msg) => {});

但我現在想發送的數據,以便一個特定的房間,而不是一般的socket.io房間。這種設置有沒有辦法可以指定房間?

或許使用socket_create()什麼的?如果可能的話,我想阻止在每個socket_write上通過房間名稱。

回答

2

客戶端只能將數據發送到服務器本身。如果您想向特定房間內的所有用戶發送消息,請創建一條客戶端可以發送的消息,告訴服務器代表客戶端進行此操作。

// client-side 
socket.emit("sendToRoom", {room: "someRoom", data: "Hello"}); 

而且,然後在服務器上:

socket.on('sendToRoom', function(msg) { 
    // send to all clients in the room except the socket client 
    socket.broadcast.to(msg.room, msg.data); 
}); 

如果客戶僅在一個房間裏,那麼你就可以在客戶端只是將消息發送到廣播到目前的房間,在服務器看看它在哪個房間。這樣,客戶端不必每次都發送房間。

+0

客戶端只需要接收數據。我需要一種方法來從PHP到我的服務器通信一個特定的房間名稱。這是否意味着我必須爲每個'socket_write'傳遞一個包含我的HTML和房間名稱的對象? –

+0

@ Stephan -v - 你看過我的最後一段了嗎?我很困惑,因爲你討論了一個webSocket和socket.io。你有兩個單獨的連接?一個socket.io服務器可以查找任何客戶端在哪個房間。 – jfriend00

+0

沒有像Redis之類的橋樑或類似的東西。我直接從PHP的本地websocket功能發送數據到我的node.js服務器。這個服務器只是獲得通用數據,但在那個時候,我已經失去了告訴node.js服務器將數據發送到哪個空間的能力。 –