当发送大的Json时,NodeJS的socket.IO会断开连接

7
我正在编写一个多层卡牌游戏(类似炉石传说),使用Nodejs后端和Angular前端。我尝试使用Socket.IO将它们连接起来,但是当我发送一个长度超过8000字符的JSON对象(游戏状态对象)时,客户端会一直断开和重新连接。如果我只发送对象的6000个字符的子字符串,那么一切都正常,但是当发送超过8000个字符时程序就崩溃了(我需要大约20000个字符)。我只在本地主机上测试了。这是后端代码:
    constructor() {
    this.app = express();
    this.port = process.env.PORT || ChatServer.PORT;
    this.server = createServer(this.app);
    this.io = socketIo(this.server);
    this.gameService = new GameService();
    this.listen();
}

listen(): void {
    this.server.listen(this.port, () => {
        console.log('Running server on port %s', this.port);
    });

    this.io.on('connect', (socket: any) => {
        console.log('Connected client on port %s.', this.port);
        socket.on('message', (m: string) => {
            console.log('[server](message): %s', JSON.stringify(m));
            this.io.emit('message', JSON.stringify(this.gameService.getGameState()).substring(1, 6000));
        });

        socket.on('disconnect', () => {
            console.log('Client disconnected');
        });
    });
}

编辑:使用ajax可以完美地工作,但我需要sockets。

是的,但我的对象大约有4-5 MB,而不是300 MB。 - Ez Az
当您发送一个子字符串时,您实际上只是在执行gameStateJSON.slice(0, 6000)吗?我想知道在第8000个字符之后是否有无效的JSON? - Cory Danielson
可能是超时问题?您可以在 socketio 中调整 pingTimeout 和 pingInterval。您可能需要获取更多日志来了解出了什么问题。 - Cory Danielson
它每1秒就会断开并重新连接一次,所以我不认为时间是问题。 - Ez Az
1
@EzAz - 周期性重新连接有时可能是由于socket.io客户端和服务器版本不匹配引起的。您是否100%确定客户端和服务器上的socket.io版本完全相同? - jfriend00
显示剩余2条评论
1个回答

6

Socket.io默认接收数据的最大大小为1 MB(v3及以上版本)。而在v2及之前的版本,该值为100 MB

创建服务器时,您可以使用maxHttpBufferSize来增加您希望接收的数据包的最大大小。

const io = require("socket.io")(httpServer, {
    maxHttpBufferSize: 1e8    // 100 MB
});

根据迁移文档
  • 发送大负载(> 1MB)时,客户端会断开连接。

这可能是因为现在maxHttpBufferSize的默认值为1MB。当接收到比此更大的数据包时,服务器将断开与客户端的连接,以防止恶意客户端对服务器进行过载攻击。

您可以在创建服务器时调整此值:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接