NodeJS socket.IO 发送大 Json 时断开连接

Ez *_* Az 7 large-data node.js socket.io typescript

我正在编写一个带有 Nodejs 后端和有角度前端的多层纸牌游戏(如炉石传说)。

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

如果我只发送对象的 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');
        });
    });
}
Run Code Online (Sandbox Code Playgroud)

编辑:它与ajax配合得很好,但我需要套接字

小智 6

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

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

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

根据迁移文档

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

这可能是因为 的默认值为 maxHttpBufferSizenow 1MB。当服务器收到大于此大小的数据包时,将断开客户端的连接,以防止恶意客户端使服务器过载。

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