当两个客户连接到同一个房间时。是从一个客户到房间的消息,转到另一个客户端?

时间:2016-08-07 17:18:41

标签: socket.io

到目前为止,我只在socket.io中从客户端向服务器或从服务器向客户端发送消息。

现在我想在client1client2之间发送一些消息。其中一个客户端将发出消息,另一个客户端将发出消息。

我的问题是它是否会起作用?

客户端1:

io.join('myroom')

客户端2:

io.to('myroom').emit('mymessage',)

client1是否会收到来自client2的消息?

换句话说:是socket.io服务器,也是在客户端之间移动消息,还是只从客户端发送客户端?

1 个答案:

答案 0 :(得分:1)

您无法从客户端执行io.join()。这只是服务器可以做的事情。

因此,您需要将服务器用于.join()个客户端。您可以创建自己的消息,客户端发送给服务器,请求将其添加到房间并让服务器为您执行此操作。

您也无法使用io.to('myroom').emit('mymessage')从客户端直接向房间发送消息。这是仅在服务器上可用的功能。您只能从客户端发送到服务器。因此,再次,您将创建自己的消息,客户端发送到服务器,要求服务器将此消息广播到特定的房间。

因此,从客户端,你可以这样做:

io.send("requestJoin", "myroom");

之后你可以要求服务器像这样发送到那个房间:

io.send("sendToRoom", {room: "myroom", msg: "Hello"});

然后,服务器可以拥有这两条消息的处理程序:

io.on('connection', function(socket){
    socket.on("requestJoin", function(room) {
        socket.join(room);
    });

    socket.on("requestLeave", function(room) {
        socket.leave(room);
    });

    socket.on("sendToRoom", function(data) {
        io.to(data.room, data.msg);
    });
});

这是以这种方式实现的,原因有两个:

  1. 客户端只与服务器建立连接,而不与其他客户端建立连接,因此必须将要发送给其他客户端的任何内容发送到服务器。

  2. 服务器可以控制哪些客户端可以加入哪个房间。因此,如果您希望客户加入一个房间,您必须要求服务器执行此操作,并且服务器可以决定是否要代表您实际执行此操作。

  3. 房间完全是服务器概念和数据结构,所以完全取决于服务器来管理它们。