【问题标题】:socket connection in node js节点js中的套接字连接
【发布时间】:2017-02-04 15:13:30
【问题描述】:

我刚刚开始研究 node js。我一直在尝试使用 node js 制作聊天应用程序。其中单个用户可以通过多个设备或浏览器登录。如果我没有错,并且据我所知,每个浏览器都使用不同的端口地址进行通信,因为套接字连接是由 IP 地址和端口地址定义的,因此当同一个用户从两个不同的浏览器登录时,服务器会创建两个不同的套接字 ID。现在我验证如果用户已经通过检查参数发送到套接字信息连接。然后如果用户已经连接或者已经为用户设置了套接字,那么我创建连接以将套接字ID更改为以前的套接字ID。

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

其中 k 是先前连接的同一用户的套接字 id

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

【问题讨论】:

    标签: javascript node.js sockets port


    【解决方案1】:

    如果我正确理解您的问题,让我尝试以我的方式解释。假设您有以下服务器代码:

        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 和端口,如果你打开三个选项卡并且你有一些像上面这样的实现,所有的选项卡都会监听“hello”。使用房间,您可以对用户进行分组并隔离通信,以便只有在正确用户之间而不是所有用户之间进行通信的用户。

    祝你好运!

    【讨论】:

    • 我的问题完全是针对不同的浏览器或计算机。当用户从多台计算机登录或可能是不同的浏览器时会发生什么。
    • 不同的浏览器或不同的计算机(当您没有房间/命名空间实现时)将与拥有许多选项卡相同。套接字将打开,可以说someIp:somePort,例如98.45.32.21:3000,这不会改变,所以,当一个人发送“hello”时,服务器会用 hello 回应每个人(在上面的实现中)。
    • 如果您希望用户从两个不同的浏览器登录并看到相同的消息 - 但只看到他的消息,那么您应该将该用户与正确的房间相关联,以便当他从一秒钟开始连接时浏览器,你知道它是用户sagar,你会在正确的房间加入他。
    【解决方案2】:

    我对 Sockets(和 JS)也很陌生,我也在尝试制作一个聊天应用程序,但有点不同。

    据我了解,该消息只会在一个浏览器上收到。更好的设计是让用户通过多个浏览器/设备进行连接。您可以维护用户连接的所有套接字的列表(如果需要)。

    如果您需要一对一聊天,也许您可​​以编写一些代码,将两个用户连接的所有套接字连接到一个房间中。

    socket.room = roomname
    socket.join(roomname)
    

    然后您只需将消息广播到那个房间。这样,两个用户都连接到的每个套接字都会收到消息。

    socket.to(socket.room).broadcast.emit("message", message);
    

    (我正在将房间信息保存在socket中,不知道这是不是一个好的设计)

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-02
      • 2022-09-28
      • 1970-01-01
      • 2014-05-25
      • 2012-12-15
      • 1970-01-01
      • 2015-06-04
      • 1970-01-01
      相关资源
      最近更新 更多