到目前为止,我只在socket.io
中从客户端向服务器或从服务器向客户端发送消息。
现在我想在client1
和client2
之间发送一些消息。其中一个客户端将发出消息,另一个客户端将发出消息。
我的问题是它是否会起作用?
客户端1:
io.join('myroom')
客户端2:
io.to('myroom').emit('mymessage',)
client1
是否会收到来自client2的消息?
换句话说:是socket.io服务器,也是在客户端之间移动消息,还是只从客户端发送客户端?
答案 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);
});
});
这是以这种方式实现的,原因有两个:
客户端只与服务器建立连接,而不与其他客户端建立连接,因此必须将要发送给其他客户端的任何内容发送到服务器。
服务器可以控制哪些客户端可以加入哪个房间。因此,如果您希望客户加入一个房间,您必须要求服务器执行此操作,并且服务器可以决定是否要代表您实际执行此操作。
房间完全是服务器概念和数据结构,所以完全取决于服务器来管理它们。