在node.js中,我有一个像这样设置的服务器(快速)
app.post('/request', function(req, res) {
// TODO get socket, then do socket.emit('message', {});
res.end();
});
和套接字
var io = socket.listen(server);
io.on('connection', function(socket){
console.log('Detected Request');
socket.on('disconnect', function() {
console.log('Request Finished');
});
});
如果有客户端,谁首先连接到服务器,创建套接字,然后为POST
执行/request
,如何从后处理函数中获取该客户端的套接字对象?
由于
答案 0 :(得分:1)
当您从客户端连接套接字时,您必须将用户ID与套接字一起传递,您必须捕获它并使用它来识别该用户的套接字。
const socket = io();
io('/', { query: "id=user id here" });
服务器端代码:
var connectedUsers = {};
var io = socket.listen(server);
io.on('connection', function(socket){
var userId = socket.handshake.query['id'];
var connectedUser = {id:userId, socket:socket}
// every socket connection will have unique socket.id which we use to store in socket and identify if disconnected.
connectedUsers[socket.id] = connectedUse
socket.on('disconnect', function() {
for(var i in connectedUsers)
if(connectedUsers[i].socket.id === socket.id){
delete connectedUsers[i];
}
});
});
现在,在您的帖子请求中,您必须使用相同的ID识别用户并为用户获取相应的套接字。
app.post('/request', function(req, res) {
var userId = 'write your code to get user id';
if(connectedUsers[userId])
connectedUsers[userId].socket.emit('message', {});
else
console.log('User not online');
res.end();
});
注意:在您正确处理用户ID之前,这只是一个示例。
如果您只能在登录后识别用户,则必须为用户登录创建套接字事件,并从客户端向服务器发出用户ID,并在登录事件中写入“连接”代码。
答案 1 :(得分:0)
需要使用TCP消息识别客户端。
为了进行测试,可以使用文件描述:req.socket.fd === socket.fd
。
请记住,这仅适用于一个服务器,因为http请求可能会打开另一个套接字。
答案 2 :(得分:0)
埋在socket.io文档中的是sending mesagges from the outside world,建议方法是socket.io-emitter。我无法让它工作,我认为这只是广播而不是特定的客户。相反,我从socket.js中导出io
对象中的发送函数。
文件app.js:
app.post('/request', function(req, res) {
var clientid = //you need to capture the socket id you want at ****
//and pass it in the post body or cookie
SOCKET.sendX(clientid, "my message");
res.end();
});
var server = app.listen(8088);
var SOCKET = require("./socket")(server);
文件socket.js:
module.exports = function(server) {
var io = socket.listen(server);
io.on('connection', function(socket){
//****
//here you have to save socket.id for use in your post method
//the usual stuff
socket.on('xxx', function() {
}
return {
sendX: function send(socket, msg) {
io.clients().connected[socket].emit("sendX", msg);
}
}
}
附注:没有必要在原始帖子中保留connectedUsers
变量,因为它们位于io.clients()中。已连接
我的代码工作得很好,但它是用Typescript编写的,所以可能会有一些错误,因为我手动翻译了这个答案。