我正在尝试将websocket.io
与nodejs
和angular
一起使用。我正在尝试构建一对一的聊天应用程序。这是我的代码段:
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
从客户端传递到服务器,以便服务器知道需要在哪个客户端上发送数据?
答案 0 :(得分:0)
这里有两件事,app.io
和socket
。在第一个代码段中,您使用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
将消息发送到该特定客户端。