节点js中的套接字连接

时间:2016-09-27 05:58:31

标签: javascript node.js sockets port

我刚刚开始研究节点js.I一直在尝试使用节点js创建聊天应用程序。单个用户可以通过多个设备或浏览器登录。如果我没有错,并且我理解每个浏览器与不同的端口地址通信,因为套接字连接是由IP地址和端口地址定义的,因此当同一用户从两个不同的浏览器登录时,服务器创建两个不同的套接字Id.Now我验证如果用户已通过检查参数发送到套接字信息已连接。然后,如果用户已连接或已为用户设置套接字,则我创建连接以将套接字ID更改为先前的套接字ID为。

io.on('connection', function(socket){
 socket.id = k;
});

其中k是先前连接的相同用户的套接字ID

现在,当任何其他客户端向当前用户发出消息时,则替换套接字ID,并且只有一个浏览器获取消息,或者两者都获得消息。是否为浏览器或单个浏览器设置了服务器连接。请帮帮我。我还不清楚客户端和服务器之间如何建立套接字连接。 如果我做错任何假设请改进或如何解决以下场景。 提前致谢

2 个答案:

答案 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中保存房间信息,不知道这是不是一个好的设计)

希望这有帮助!