- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试将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 客户端
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
发送时才显示消息,但由于安全问题,这应该仅在服务器端处理。
因此,我希望能够仅发送给特定的用户
。我认为这可以通过使用 socket.id
来完成,它对于每个连接都是唯一的。但是我如何将这个 socket.id
从客户端传递到服务器,以便服务器知道它需要在哪个客户端上发送数据?
最佳答案
这里有两个东西,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 save socket
from app.io.on('connection'...
) 并使用 socket.emit
向该特定客户端发送消息。
关于node.js - 使用 Angular 和 Nodejs 的 Websocket : How to send data to specific client,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51346260/
我是一名优秀的程序员,十分优秀!