我刚刚开始研究节点js.I一直在尝试使用节点js创建聊天应用程序。单个用户可以通过多个设备或浏览器登录。如果我没有错,并且我理解每个浏览器与不同的端口地址通信,因为套接字连接是由IP地址和端口地址定义的,因此当同一用户从两个不同的浏览器登录时,服务器创建两个不同的套接字Id.Now我验证如果用户已通过检查参数发送到套接字信息已连接。然后,如果用户已连接或已为用户设置套接字,则我创建连接以将套接字ID更改为先前的套接字ID为。
io.on('connection', function(socket){
socket.id = k;
});
其中k是先前连接的相同用户的套接字ID
现在,当任何其他客户端向当前用户发出消息时,则替换套接字ID,并且只有一个浏览器获取消息,或者两者都获得消息。是否为浏览器或单个浏览器设置了服务器连接。请帮帮我。我还不清楚客户端和服务器之间如何建立套接字连接。 如果我做错任何假设请改进或如何解决以下场景。 提前致谢
答案 0 :(得分:2)
如果我理解你的问题,请让我尝试解释一下。假设您有以下服务器代码:
var io = require('socket.io')(somePort); //same port for the client to connect, e.g. 3000
io.on('connection', function(socket){
// in here you should define any actions on your primary socket
// for example:
socket.on("hello", function(dataUserSendsWithTopicHello){// overly long variable name to show my point! :)
// do something with hello data
});
// this will go to anyone who is connected and has a handler like above for "hello"
socket.emit("hello", "hello to all who listen to hello topic");
});
相应的客户将是:
var socket = io.connect('ip:port'); // e.g. localhost:3000 - same ip and port as above
socket.on('hello', function(serverResponseToHello){
// do something when server sends back something on hello
});
// send a hello to the server
socket.emit("hello", "Sending hello to server");
现在,如果您只想回复一个用户,或者群组的人一起查看某些消息,就像在聊天中一样,您可以利用套接字。 io的房间/名称空间实现(http://socket.io/docs/rooms-and-namespaces/)并为每个客户创建一个房间,或为一组客户创建一个房间。为此,请看一下这个答案:Using Socket.io with multiple clients connecting to same server
总结一下,有一个ip和一个端口。每个人都听这个ip和端口,如果你打开三个标签,你有一些如上所述的实现,所有标签都会听到"你好"。使用房间,您可以对用户进行分组并隔离通信,以便只有正确用户之间进行通信的用户才能进行通信。
祝你好运!答案 1 :(得分:0)
我对Sockets(和JS)来说也是一个新手,我也试图制作一个聊天应用程序,但有点不同。
据我所知,该消息只能在一个浏览器上收到。更好的设计是让用户通过多个浏览器/设备连接。您可以维护用户连接的所有套接字列表(如果需要)。
如果您需要一对一聊天,也许您可以编写一些代码,其中两个用户连接的所有套接字都连接到一个房间。
socket.room = roomname
socket.join(roomname)
然后你只是将信息广播到那个房间。这样,用户连接到的每个套接字都会收到消息。
socket.to(socket.room).broadcast.emit("message", message);
(我在socket中保存房间信息,不知道这是不是一个好的设计)
希望这有帮助!