【发布时间】: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