node.js - 连接数不正确

标签 node.js socket.io

我写了一个非常简单的脚本来检索已连接用户的列表。

var app, io, server;

app = require("express")();
server = require("http").createServer(app);
io = require("socket.io").listen(server);

server.listen(1339);

app.get("/", function(req, res) {
  res.sendfile(__dirname + "/index.html");
});

console.log('INIT', io.sockets.manager.server.connections);

io.sockets.on("connection", function(socket) {
  console.log('CONNECT: ', io.sockets.manager.server.connections);
  socket.on("disconnect", function(data) {
    console.log('DISCONNECT: ', io.sockets.manager.server.connections);
  });
});

和 HTML:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>title</title>
</head>
<body>
    <script src="/socket.io/socket.io.js"></script>
    <script>
        var socket = io.connect('http://localhost:1339');
    </script>
</body>
</html>

当我运行应用程序时,我在初始化时得到 0,但是一旦我在浏览器中打开页面,它就会给我 4 连接,而不仅仅是 1 。我还得到一个 connections property is deprecated。使用 getConnections() 方法 警告。我在 v0.10.15 中使用 Node ,在 v0.9.16 中使用 socket.io。

最佳答案

您需要从不同的位置获取客户端数量:

 io.sockets.clients().length

但是,当您阅读 this active GitHub issue ,您可能希望避免该操作,因为它可能导致额外的内存泄漏(超出套接字已经发生的情况)。

这是一个完整的工作示例:

var app = require('express')();
var server = require("http").createServer(app);
var io = require('socket.io').listen(server);

server.listen(1339);

app.get('/', function(req, res) {
    return res.sendfile(__dirname + "/index.html");
});

/*
    to obtain number of connected clients
        io.sockets.clients().length            
 */

console.log("INIT", io.sockets.clients().length );

io.sockets.on("connection", function(socket) {
    console.log("CONNECT:" + io.sockets.clients().length);
    socket.on("disconnect", function(data){
        console.log("DISCONNECT: ", io.sockets.clients().length);
    });
});

断开连接事件发生在客户端被删除之前,因此计数将比客户端总数多一个(取决于您如何看待它)。

此外,由于某些原因,您的 on 事件处理程序返回值,所以我删除了它。

与其使用该函数,不如使用一个简单的计数器,您可能会运气更好:

var clientsConnected = 0;

console.log("INIT", io.sockets.clients().length );

io.sockets.on("connection", function(socket) {
    console.log("CONNECT:" + ++clientsConnected);
    socket.on("disconnect", function(data){
        console.log("DISCONNECT: ", --clientsConnected);
    });
});

显然有人报告断开连接的次数可能超过连接数,因此您可能希望防止计数器下降到零以下。

连接两个客户端(然后断开一个):

info: socket.io started
INIT 0
debug: served static content /socket.io.js
debug: client authorized
info: handshake authorized eJcvVsr60fmRzhVpQ6rO
debug: setting request GET /socket.io/1/websocket/eJcvVsr60fmRzhVpQ6rO
debug: set heartbeat interval for client eJcvVsr60fmRzhVpQ6rO
debug: client authorized for 
debug: websocket writing 1::
CONNECT:1
debug: served static content /socket.io.js
debug: client authorized
info: handshake authorized 28lUudTS3KtCphd0Q6rP
debug: setting request GET /socket.io/1/websocket/28lUudTS3KtCphd0Q6rP
debug: set heartbeat interval for client 28lUudTS3KtCphd0Q6rP
debug: client authorized for 
debug: websocket writing 1::
CONNECT:2
info: transport end (socket end)
debug: set close timeout for client 28lUudTS3KtCphd0Q6rP
debug: cleared close timeout for client 28lUudTS3KtCphd0Q6rP
debug: cleared heartbeat interval for client 28lUudTS3KtCphd0Q6rP
DISCONNECT:  2
debug: discarding transport
info: transport end (socket end)
debug: set close timeout for client eJcvVsr60fmRzhVpQ6rO
debug: cleared close timeout for client eJcvVsr60fmRzhVpQ6rO
debug: cleared heartbeat interval for client eJcvVsr60fmRzhVpQ6rO
DISCONNECT:  1
debug: discarding transport

关于node.js - 连接数不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18446103/

相关文章:

node.js - 如何在lerna中导入本地git仓库?

node.js - 使用 Firebase Cloud Functions 扇出数据

javascript - Node.js - Socket.io io.emit() 不执行任何操作

javascript - 所有 (message).delete() 函数推送 : Unknown Message Error. Discord.js

javascript - 如何设置下载 header 以避免客户端 Windows Defender 阻止 javascript 文件

从C程序连接到node.js websocket服务器

node.js - 服务三个.js?

ruby-on-rails - 如何在我的网站和我客户的网站之间创建通信 API

node.js - 如何在 Node.js 中对 pdfkit PDF 文件生成进行正确的回调?

javascript - Socket.io版本2.1.0错误404