Reputation: 123
I'm writing a multilayer card game (like hearthstone) with Nodejs back-end and an angular front-end.
I tried to connect the two with Socket.IO, but it turned out that if I send a JSON object over about 8000char(the gameState object), then the client just keeps disconnecting and reconnecting.
If I only send the substring of 6000 char of the object everything is fine, but it crashes over 8000(I need about 20 000)
I have only tried in localhost
Here is the backend:
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');
});
});
}
Edit:It works perfectly well with ajax, but I would need sockets
Upvotes: 8
Views: 2469
Reputation: 96
Socket.io has a default value of 1 MB
(v3 onwards) as the maximum data size that it can receive. For v2 and before, this value used to be 100 MB
.
You can use maxHttpBufferSize
to increase the maximum size of data packet that you want to receive when creating the server.
const io = require("socket.io")(httpServer, {
maxHttpBufferSize: 1e8 // 100 MB
});
According to the migration docs:
- the client is disconnected when sending a big payload (> 1MB)
This is probably due to the fact that the default value of
maxHttpBufferSize
is now1MB
. When receiving a packet that is larger than this, the server disconnects the client, in order to prevent malicious clients from overloading the server.You can adjust the value when creating the server:
Upvotes: 6