【问题标题】:Pass socket.io room with socket_write?使用 socket_write 传递 socket.io 房间?
【发布时间】:2018-02-20 06:25:17
【问题描述】:

我目前正在使用socket_write 打开 websocket 并将数据传递给 node.js socket.io 服务器。我正在像这样发送一些 HTML:

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 上传递房间名称。

【问题讨论】:

    标签: php node.js sockets websocket socket.io


    【解决方案1】:

    客户端只能将数据发送到服务器本身。如果您想向特定房间中的所有用户发送消息,请创建一条客户端可以发送的消息,告诉服务器代表客户端执行此操作。

    // 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);
    });
    

    如果客户端只在一个房间里,那么你可以让客户端发送一条消息广播到它当前的房间,然后让服务器查找它在哪个房间。这样,客户端就不必发送每次都有房间。

    【讨论】:

    • 客户端只需要接收数据。不过,我需要一种方法来从 PHP 与我的服务器通信一个特定的房间名称。这是否意味着我必须为每个“socket_write”传递一个包含我的 HTML 和房间名称的对象?
    • @Stephan-v - 你看到我的最后一段了吗?我很困惑,因为您同时讨论了 webSocket 和 socket.io。你有两个独立的连接吗? socket.io 服务器可以查找任何客户端所在的房间。
    • 没有像 Redis 这样的桥或类似的东西。我将数据直接从 PHP 的本机 websocket 功能发送到我的 node.js 服务器。该服务器只获取通用数据,但此时我已经无法告诉 node.js 服务器将数据发送到哪个房间。
    • @Stephan-v -我真的不明白你的问题是什么。就像我说的那样,node.js 服务器知道连接所在的房间,所以如果你试图发送到连接所在的同一个房间,你可以在 node.js 服务器上查找它。除此之外,您必须告诉服务器您希望消息发送到哪个房间,而对传入的 socket.io 消息执行此操作的唯一方法是将其包含在消息中。我不知道你希望用 redis 做什么。
    • and the only way to do that for an incoming socket.io message is to include it in the message 谢谢你,这就是我正在寻找的答案。我想知道这是否是唯一的选择。
    猜你喜欢
    • 2020-01-10
    • 1970-01-01
    • 2017-10-20
    • 2019-05-13
    • 1970-01-01
    • 2016-05-08
    • 2019-03-02
    • 2011-12-02
    • 1970-01-01
    相关资源
    最近更新 更多