代码之家  ›  专栏  ›  技术社区  ›  Manish Saraan

检测客户端是否使用socket.io(NodeJs)与网络断开连接

  •  0
  • Manish Saraan  · 技术社区  · 7 年前

    我正在创建一个带有node.js和socket.io的应用程序。我需要检测客户端是否已断开与internet的连接,并手动/自动启动socket.disconnect()。

    我已经找了,但找不到任何解决办法。

    const app = require('express')();
    const server = require('http').Server(app);
    const io = require('socket.io')(server);
    const fs = require('fs');
    
    server.listen(8005, () => console.log('app is running at 8005 port'));
    
    app.get('/', (req, res) => {
        res.sendFile(__dirname + '/index.html');
    })
    
    const sockets = {};
    io.sockets.on('connection', (socket) => {
        socket.once('disconnect', function () {
            console.log('-------disconencted', socket.userId); 
            delete sockets[socket.userId];
        });
        socket.on('init', (data) => {
            socket.userId = data.userId;
            sockets[data.userId] = socket;
            sockets[data.userId].emit('userOnline', { id : data.userId});
            console.log(socket.userId,'--------useronline-----------',data)
        });
    
    
        socket.on('test', (data) => {
            socket.emit('testResp', { id : 'sdfd'});
            console.log('--------useronline-----------',socket.userId);
        });
    
        socket.on('total', data => {
            socket.emit('totalResp', { users: Object.keys(sockets)})
            console.log('--------total-----------',socket.userId);
    
        })
    
    
    
    
    
    })
    

    客户端代码:

    var socket = io('http://localhost:8005');
        socket.on('userOnline', function (data) {
            console.log(socket.userId, '---userOnline--------', data);
        });
    
        socket.on('testResp', function (data) {
            console.log(socket.userId, '----testResp-------', data);
        });
    
        socket.on('totalResp', function (data) {
            document.querySelector('#total_users_length').innerHTML = data.users.length;
    
            console.log(socket.userId, '----totalResp-------', data);
        });
        document.querySelector('#init').addEventListener('click', function(){
    
            socket.emit('init', {userId: document.querySelector('input').value});
        });
    
        document.querySelector('#test').addEventListener('click', function(){
    
          socket.emit('test', {test: 'tst'});
        });
    
        document.querySelector('#total').addEventListener('click', function(){
    
        socket.emit('total', {test: 'tst'});
        });
    

    我将用户的用户id存储在socket中,这样当用户断开与服务器的连接时,我可以找到它的id并发送通知。 提前谢谢。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Aditya_Anand    7 年前

    我想你是在找脱节事件,你可以试试这个。

    socket.on('disconnect', function () {
        io.emit('user disconnected');
      });
    });
    

    因为你已经在代码中添加了这个。每当客户机不响应socket在内部实现的heartbeat时,socket就会触发disconnect事件。您可以查看文档以了解更多信息 Socket.io

    推荐文章