socket.ioでいろいろやっているけど、ローカル環境で動く分には問題ないが、サーバで動かした際に1分~2分毎に、connectとdisconnectが繰り返され、その間、socket通信ができない状態になっている。とりあえずなんとか動く状況にはなったので記録。
試したこと1 アイドル時間の可能性(結果☓)
ユーザがオペレーションをしない状態が続くと勝手にアイドルになると想定し2秒毎にクライアントとサーバ間で疎通を行うよう組んだ。(
node.js - NodeJS + Socket.io connections dropping/reconnecting? - Stack Overflow
)
しかし、結局1分程度経つとping/pongが途中で止まりこれが原因ではないみたい。(ローカルでは起きないから関係ないよな、そもそも)
function sendHeartbeat(){ setTimeout(sendHeartbeat, 2000); io.sockets.emit('ping', { beat : 1 }); } io-connections-dropping-reconnecting setTimeout(sendHeartbeat, 2000);
試したこと2 パラメータをいじった(結果○)
タイムアウト系のパラメータをapp.jsに指定した。(なんか怪しい)
io.set('close timeout', 3);
とりえあず、console.logでsocketの中身を見るとこんな感じになっていた。こちらを参照していろいろパラメータの意味とか調べないと。
https://github.com/Automattic/socket.io/wiki/Configuring-Socket.IOAutomattic/socket.io · GitHub
{ id: 'yIhQgIj8g8wlagmYYBtk', namespace: { manager: { server: [Object], namespaces: [Object], sockets: [Circular], _events: [Object], settings: [Object], handshaken: [Object], connected: [Object], open: [Object], closed: [Object], rooms: [Object], roomClients: [Object], oldListeners: [Object], sequenceNumber: 1264589668, gc: [Object] }, name: '', sockets: { Xmm7ECeDRktwqqHUYBtj: [Object], yIhQgIj8g8wlagmYYBtk: [Circular] }, auth: false, flags: { endpoint: '', exceptions: [] }, _events: { connection: [Object] } }, manager: { server: { domain: null, _events: [Object], _maxListeners: 10, _connections: 11, connections: [Getter/Setter], _handle: [Object], _usingSlaves: false, _slaves: [], allowHalfOpen: true, httpAllowHalfOpen: false, timeout: 120000, _connectionKey: '4:0.0.0.0:3000' }, namespaces: { '': [Object] }, sockets: { manager: [Circular], name: '', sockets: [Object], auth: false, flags: [Object], _events: [Object] }, _events: { 'set:transports': [Object], 'set:store': [Function], 'set:origins': [Function], 'set:flash policy port': [Function], 'set:flash policy server': [Function] }, settings: { origins: '*:*', log: true, store: [Object], logger: [Object], static: [Object], heartbeats: true, resource: '/socket.io', transports: [Object], authorization: false, blacklist: [Object], 'log level': 3, 'log colors': true, 'close timeout': 60, 'heartbeat interval': 25, 'heartbeat timeout': 60, 'polling duration': 20, 'flash policy server': true, 'flash policy port': 10843, 'destroy upgrade': true, 'destroy buffer size': 100000000, 'browser client': true, 'browser client cache': true, 'browser client minification': false, 'browser client etag': false, 'browser client expires': 315360000, 'browser client gzip': false, 'browser client handler': false, 'client store expiration': 15, 'match origin protocol': false }, handshaken: { Xmm7ECeDRktwqqHUYBtj: [Object], yIhQgIj8g8wlagmYYBtk: [Object] }, connected: { Xmm7ECeDRktwqqHUYBtj: true, yIhQgIj8g8wlagmYYBtk: true }, open: { Xmm7ECeDRktwqqHUYBtj: true }, closed: { Xmm7ECeDRktwqqHUYBtj: [], yIhQgIj8g8wlagmYYBtk: [] }, rooms: { '': [Object] }, roomClients: { Xmm7ECeDRktwqqHUYBtj: [Object], yIhQgIj8g8wlagmYYBtk: [Object] }, oldListeners: [ [Object] ], sequenceNumber: 1264589668, gc: { _idleTimeout: 10000, _idlePrev: [Object], _idleNext: [Object], _idleStart: 1401423953340, _onTimeout: [Function: wrapper], _repeat: true } }, disconnected: false, ackPackets: 0, acks: {}, flags: { endpoint: '', room: '' }, readable: true, store: { store: { options: undefined, clients: [Object], manager: [Object] }, id: 'yIhQgIj8g8wlagmYYBtk', data: {} }, _events: { error: [Function] } }