Node.js 当连接多个客户端时,socket.io应用程序失败

Node.js 当连接多个客户端时,socket.io应用程序失败,node.js,socket.io,Node.js,Socket.io,我为我的一个站点编写了一个功能,当另一个用户向他们发送消息时,该功能会向用户发送警报。如果我只为少数用户启用该功能,那么该功能在开发和生产中都可以使用。然后,当为几千个并发用户启用该功能时,该功能会严重失败(推送警报将停止发送)(服务器将保持正常运行,因此它不会简单地死亡)。从日志来看,似乎在“send_msg”事件中找不到套接字 我还注意到,当我尝试直接从浏览器访问时,有时加载,有时不加载,我不知道原因可能是什么。我在下面发布的代码中有什么错误吗?在过去的三天里,我一直在为这件事伤脑筋 编辑:

我为我的一个站点编写了一个功能,当另一个用户向他们发送消息时,该功能会向用户发送警报。如果我只为少数用户启用该功能,那么该功能在开发和生产中都可以使用。然后,当为几千个并发用户启用该功能时,该功能会严重失败(推送警报将停止发送)(服务器将保持正常运行,因此它不会简单地死亡)。从日志来看,似乎在“send_msg”事件中找不到套接字

我还注意到,当我尝试直接从浏览器访问时,有时加载,有时不加载,我不知道原因可能是什么。我在下面发布的代码中有什么错误吗?在过去的三天里,我一直在为这件事伤脑筋

编辑:看起来,将ulimit从1024提高到65535会在应用程序开始失败前几分钟再次出现“警告-客户端未握手客户端应重新连接”和“警告-websocket解析器错误:操作码10无处理程序”错误。我确信我一次没有接近65535个并发连接。有人能解释一下我是不是走对了路吗

服务器代码(Server.js):

var io = require('socket.io').listen(4086);
var clients = {};

io.sockets.on('connection', function (socket) {
    socket.on('login', function (data) {
        if (typeof data.id_user !== 'undefined' && data.id_user > 0) {
            socket.set('id_user', data.id_user, function() {});
            clients[data.id_user] = socket.id;
        }
    });

    socket.on('send_msg', function (data) {
        if (typeof io.sockets.sockets[clients[data.id_sendee]] !== 'undefined') {
            var sendeeSocket = io.sockets.sockets[clients[data.id_sendee]];
            sendeeSocket.emit('newalert', {
                sender_profile: data.sender_profile,
                msg: data.msg,
                send_to: data.send_to });
        }
    });

    socket.on('disconnect', function() {
        socket.get('id_user', function (err, id_user) {
            if (typeof id_user !== 'undefined' && id_user > 0) {
                delete clients[id_user];
            }
        });
    });
});
<html>
<head>
<script src="http://www.mydomain.com:4086/socket.io/socket.io.js"></script>
<script>
    var socket = io.connect('http://www.mydomain.com:4086');

    socket.emit('login', { id_user: <?=$idUser?> });

    socket.on('newalert', function (data) {
        $("#msg_stream").hide();
        $("#stream_sender_profile").html(data.sender_profile);
        $("#stream_msg").text(data.msg);
        $("#stream_send_to").html(data.send_to);
        $("#msg_stream").fadeIn();
    });
</script>
</head>
<body>

.......

<script>
    // Alert stream
    $(document).ready(function() {
        $("#submit_btn").click(function() {
            var msg = $("#message").val();
            if (msg) {
                if (msg.length > 255) {
                    msg = msg.substr(0, 255) + '...';
                }
                socket.emit('send_msg', {
                    sender_profile: '<a href="/profile/view/<?=$idUser?>" class="stream_dismiss"><?=$username?></a>',
                    id_sendee: <?=$idSendee?>,
                    msg: msg,
                    send_to: '<?=isset($streamSendTo) ? $streamSendTo : '';?>' });
            }
        });
    });
</script>
</body>
</html>
客户端代码:

var io = require('socket.io').listen(4086);
var clients = {};

io.sockets.on('connection', function (socket) {
    socket.on('login', function (data) {
        if (typeof data.id_user !== 'undefined' && data.id_user > 0) {
            socket.set('id_user', data.id_user, function() {});
            clients[data.id_user] = socket.id;
        }
    });

    socket.on('send_msg', function (data) {
        if (typeof io.sockets.sockets[clients[data.id_sendee]] !== 'undefined') {
            var sendeeSocket = io.sockets.sockets[clients[data.id_sendee]];
            sendeeSocket.emit('newalert', {
                sender_profile: data.sender_profile,
                msg: data.msg,
                send_to: data.send_to });
        }
    });

    socket.on('disconnect', function() {
        socket.get('id_user', function (err, id_user) {
            if (typeof id_user !== 'undefined' && id_user > 0) {
                delete clients[id_user];
            }
        });
    });
});
<html>
<head>
<script src="http://www.mydomain.com:4086/socket.io/socket.io.js"></script>
<script>
    var socket = io.connect('http://www.mydomain.com:4086');

    socket.emit('login', { id_user: <?=$idUser?> });

    socket.on('newalert', function (data) {
        $("#msg_stream").hide();
        $("#stream_sender_profile").html(data.sender_profile);
        $("#stream_msg").text(data.msg);
        $("#stream_send_to").html(data.send_to);
        $("#msg_stream").fadeIn();
    });
</script>
</head>
<body>

.......

<script>
    // Alert stream
    $(document).ready(function() {
        $("#submit_btn").click(function() {
            var msg = $("#message").val();
            if (msg) {
                if (msg.length > 255) {
                    msg = msg.substr(0, 255) + '...';
                }
                socket.emit('send_msg', {
                    sender_profile: '<a href="/profile/view/<?=$idUser?>" class="stream_dismiss"><?=$username?></a>',
                    id_sendee: <?=$idSendee?>,
                    msg: msg,
                    send_to: '<?=isset($streamSendTo) ? $streamSendTo : '';?>' });
            }
        });
    });
</script>
</body>
</html>

var socket=io.connect('http://www.mydomain.com:4086');
emit('login',{id\u user:});
socket.on('newalert',函数(数据){
$(“#msg_流”).hide();
$(“#流#发送方#profile”).html(data.sender#u profile);
$(“#stream_msg”).text(data.msg);
$(“#stream_send_to”).html(data.send_to);
$(“#msg_stream”).fadeIn();
});
.......
//警报流
$(文档).ready(函数(){
$(“#提交”_btn”)。单击(函数(){
var msg=$(“#消息”).val();
如果(味精){
如果(msg.length>255){
msg=msg.substr(0255)+'…';
}
socket.emit('send_msg'{
发件人配置文件:“”,
id_发送方:,
味精:味精,,
将_发送到:'});
}
});
});

我最终设法解决了连接问题,我的解决方案主要围绕优化服务器配置

Node.js代码(index.js)

var arguments=process.argv.slice(2);
如果(!参数[0]){
log(“错误:缺少端口”);
过程。退出(1);
}
var serverPort=参数[0];
var redisHost='127.0.0.1';
var-redisPort=6379;
var app=require('express')();
var http=require('http')。服务器(应用程序);
var io=require('socket.io')(http);
var redis=require('socket.io redis');
适配器(redis({host:redisHost,port:redisPort}));
io.on('连接',函数(套接字){
log(socket.id+'user connected!');
socket.on('disconnect',function()){
log(socket.id+“用户已断开连接”);
});
});
listen(serverPort,function(){
log('在本地主机上侦听:'+serverPort);

});失败的具体原因是什么?当大量用户连接时,推送警报停止发送。从日志中可以看出,发送消息时似乎找不到套接字。那么,您是否解决了问题?”因为我有同样的,我找不到和回答。是的,我最终解决了这个问题并正确配置了我的应用程序。我会用答案更新这篇文章。