socket.io确定用户是在线还是离线

时间:2015-08-21 07:25:41

标签: node.js websocket socket.io real-time

我们可以通过此代码跟踪建立或断开连接

console.log('a user connected');
    socket.on('disconnect', function () {
        console.log('user disconnected');
    });
好吧,很好。但是我们如何确定用户连接或脱机的用户。我的客户端是用PHP/HTML编写的,因此他们有一个用户ID。

3 个答案:

答案 0 :(得分:24)

如果您的客户有特定的用户ID,他们需要将它们发送到socket.io服务器。例如。在客户端你可以做到

<script>
 var socket = io();
 socket.emit('login',{userId:'YourUserID'});
</script>

在服务器上你会输入像

这样的东西
var users = {};
io.on('connection', function(socket){
  console.log('a user connected');
  socket.on('login', function(data){
    console.log('a user ' + data.userId + ' connected');
    //saving userId to array with socket ID
    users[socket.id] = data.userId;
  });
  socket.on('disconnect', function(){
    console.log('user ' + users[socket.id] + ' disconnected');
  });
});

现在,您可以将套接字ID与您的用户ID配对并使用它。

答案 1 :(得分:1)

除了@galethil的答案,如果用户打开多个标签,该标签对于单个用户而言具有唯一的套接字ID,那么该怎么办?因此我们需要管理特定用户的套接字ID数组,

客户端连接:

SDK can be found here: https://github.com/okta/okta-spring-boot

Sample code can be found here: https://github.com/okta/samples-java-spring/tree/master/custom-login
<!-- SOCKET LIBRARY IN HTML -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.3.0/socket.io.js"></script>

服务器端连接:

  • 依赖关系:
const host = "http://yourdomain.com";
// PASS your query parameters
const queryParams = { userId: 123 };
const socket = io(host, {
    path: "/pathToConnection",
    transports: ['websocket'],  // https://stackoverflow.com/a/52180905/8987128
    allowUpgrades: false,
    query: queryParams,
    reconnect: false,
    secure: true,
    rejectUnauthorized: false
});

socket.once("connect", () => {
    
    // USER IS ONLINE
    socket.on("online", (userId) => {
        console.log(userId, "Is Online!"); // update online status
    });

    // USER IS OFFLINE
    socket.on("offline", (userId) => {
        console.log(userId, "Is Offline!"); // update offline status
    });

});
  • 连接:
const _ = require("lodash");
const express = require('express');
const app = express();
const port = 3000; // define your port
const server = await app.listen(port, () => {
  console.log(`We are Listening on port ${port}...`);
});

答案 2 :(得分:0)

我们可以识别服务器中谁连接谁断开的socket id。所以你可以做这样的事情。如果您在客户端有标识符,则可以使用此设置

客户

socket.emit('login', userId);

服务器端

const users = {};
io.on("connection", (socket) => {

   socket.on("login", (data) => {
      users[socket.id] = data;
    });

  socket.on("disconnecting", (reason) => {
    
    delete users[socket.id]; // remove the user. -- maybe not the exact code
  });
});

希望你能明白。