socket.io的连接为什么我只能保持在几百条
发布于 3 年前 作者 yatokami 1608 次浏览 来自 问答

我启动socket.io的服务端 代码如下

var config  = require('./config/config.js');
var express = require('express');
var app     = express();
var path    = require('path');
var http    = require('http').Server(app);
var socket  = require('socket.io-client');
var io      = require('socket.io')(http, {
    pingInterval: 14,
});

app.use(express.static(path.join(__dirname, 'public')));

http.listen(config.socket.port, () => {
    console.log('listening on port:' + config.socket.port);
});

var count1 = 0;
var count2 = 0;

io.on('connection', (socket) => {

    count1++;
    console.log('connection:'+count1);

    socket.on('msg',(data) => {
        socket.emit('msg', 'server send');
    });

    socket.on('disconnect', (socket) => {
        count2++;
        console.log('disconnect:'+count2);
    });
});

然后我客户端是使用socket-stress-test测试脚本进行连接测试

var SocketPromiseHandler = require('socket-stress-test');
var count = 0;
var disconnect = 0;
socket_handler = new SocketPromiseHandler({
    ioUrl: 'http://xxxx:3389/'
    , connectionInterval: 300 // Fire one each second
    , maxConnections: 200 // Stop at having 1000 connections
    , ioOptions: {
        transports: ['websocket'] // force only websocket (optional)
    }
});

socket_handler.new((socketTester, currentConnections)=>{
	 	count++
		console.log('client send:' + count);
	})
	.disconnect(function(socketTester) {
        disconnect++;
        console.log('disconnect:' + disconnect);
    })
    .run();
//100(ms) is interval for send event

上面这种当我运行达到200多条以后就会出现断连现象 然后我使用自己写的一种测试脚本

const io = require('socket.io-client');

var count = 0;
var disconnect = 0;
var errrr = 0;

function connect() {
    if (count++ >= 500) {
        return;
    }

    let socket = io('ws://xxxx:3389', {
        reconnection: false
    });

    socket.on('connect', () => {
        connect();

        setInterval(()=>{
            socket.emit('msg', 'client send:'+socket.id);
        },10000);

    });

    socket.on('msg',(data) => {
        // console.log(data);
    });

    socket.on('disconnect', () => {
        disconnect++;
        console.log('disconnect:' + disconnect);
    });

    socket.on('error', (error) => {
        // console.log(error)
        errrr++;
        console.log('error:' + errrr);
    });

    socket.on('reconnect', () => {
        console.log('reconnect');
    });


}

connect();

使用上面这个脚本一样是达到上百条时候断连了。 我还试过使用本机和虚拟机一起往服务端使用测试脚本,然后出现问题的情况更早出现了(可以说是原先出现问题的一半大概) 而且如果超过一定连接情况,就会把前面连接的持续断掉。 我想问下出现这些问题到底是我服务端配置有问题还是客户端呢。 因为我的服务器是Linux我也做了 查看liunx 最大文件句柄数 cat /proc/sys/fs/file-max 查看进程使用的文件句柄数 ls /proc/pid/fd | wc -l 查看进程句柄数限制 cat /proc/pid/limits | grep “files” 修改/etc/sysctl.conf 添加 fs.file-max=1000000 这些提升操作还有一些网上找的 ulimit -n等操作。但还是没用。有没有大佬懂得呀

3 回复

200左右的门槛 应该是应用级别的限制。比如 nginx 或者 socket.io 自身

@waitingsong 是说socket.io本身限制吗?我是没有使用nginx的呀

你先在服务器上测试链接数,如果没问题的话就是客户端的网络问题,如果你的客户端是在路由器下面和别人共用一个公网地址,那你的端口资源也会被限制。

回到顶部