【问题标题】:NodeJS socket.IO disconnects when sending large Json发送大Json时NodeJS socket.IO断开连接
【发布时间】:2018-12-06 17:38:39
【问题描述】:

我正在使用 Nodejs 后端和 Angular 前端编写一个多层纸牌游戏(如炉石)。

我尝试使用 Socket.IO 将两者连接起来,但事实证明,如果我发送一个超过 8000char(gameState 对象)的 JSON 对象,那么客户端只会不断断开连接并重新连接。

如果我只发送对象的 6000 字符的子字符串,一切都很好,但它会崩溃超过 8000(我需要大约 20 000)

我只在本地尝试过

这是后端:

    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 完美配合,但我需要套接字

【问题讨论】:

  • 也许可以按照socket.io GitHub issue 中的建议尝试分块。
  • 是的,但我的对象是 4-5 mb,而不是 300
  • 当你发送一个子字符串时,你真的只是在做gameStateJSON.slice(0, 6000)吗?我想知道在第 8000 个字符之后的某处是否有无效的 JSON?
  • 通常我发送整个对象,我只是使用子字符串来测试我可以通过套接字发送多少数据。如果我通过 http 发送对象,它在前端工作得非常好
  • @EzAz - 定期重新连接有时可能是由 socket.io 的客户端和服务器版本不匹配引起的。您是否 100% 确定客户端和服务器上的 socket.io 版本完全相同?

标签: node.js typescript socket.io large-data


【解决方案1】:

Socket.io 的默认值为1 MB(v3 及更高版本)作为它可以接收的最大数据大小。对于 v2 及之前的版本,此值曾经是 100 MB

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

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

根据migration docs

  • 发送大负载 (> 1MB) 时客户端断开连接

这可能是由于默认值 maxHttpBufferSize 现在是 1MB。接收到更大的数据包时 比这,服务器断开客户端,以防止 恶意客户端使服务器过载。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    • 2014-09-28
    • 2014-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多