Websockets使用angular和Node.js:如何将数据发送到特定客户端

时间:2018-07-15 07:33:34

标签: node.js angular websocket

我正在尝试将websocket.ionodejsangular一起使用。我正在尝试构建一对一的聊天应用程序。这是我的代码段:

server.js

 app.io.on('connection', function(socket){

        console.info(`Client connected [id=${socket.id}]`);
        socket.on('disconnect', function(){
            console.info(`Client gone [id=${socket.id}]`);
        });
      });

sendmessage.js

router.post("/auth/sendMessage", function(req, res) {
    //rest api to handle send message

    //mongodb insert
    app.io.emit('new-message', { message: message});
}

Angular Client

this.socket.on("new-message", function(data) {
            if (
                data.message.conversationId === self.conversationId &&
                data.message.sender === "customer"
            ) {
                self.messages.push(data.message);
                setTimeout(function() {
                    self.messagesDiv.nativeElement.scrollTop =
                        self.messagesDiv.nativeElement.scrollHeight;
                }, 100);
            }
        });

现在,我面临的问题是new-message将向所有侦听器发送消息。尽管我在客户端处理逻辑,但仅显示消息是由特定的conversationId发送的,但出于安全考虑,应该在服务器端进行处理。

因此,我只想发送给特定的users。我认为可以使用socket.id来完成此操作,该方法对于每个连接都是唯一的。但是如何将socket.id从客户端传递到服务器,以便服务器知道需要在哪个客户端上发送数据?

1 个答案:

答案 0 :(得分:0)

这里有两件事,app.iosocket。在第一个代码段中,您使用app.io.on('connection', function(socket){。此socket是新连接。您可以将此套接字对象存储在数据库或内存中的某个位置。

现在,app.io.emit会将消息发送给所有客户端,而您存储在某处的socket会将消息发送给socket.emit上的特定客户端/用户。

简而言之,您需要做

router.post("/auth/sendMessage", function(req, res) {
  //rest api to handle send message

  //mongodb insert
  socket.emit('new-message', { message: message});
}

Here是我使用插座制作的一款小型井字游戏。它将为您提供有关如何使用套接字的更多信息。这不是完美的方法,但是您仍然会了解如何使用套接字。

tl; dr从socket保存app.io.on('connection'...并使用socket.emit将消息发送到该特定客户端。