Socket.io: ์œ ํœด ์ƒํƒœ์ผ ๋•Œ JS ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค(WebSocket์ด ์ด๋ฏธ CLOSING ๋˜๋Š” CLOSED ์ƒํƒœ์— ์žˆ์Œ).

์— ๋งŒ๋“  2018๋…„ 05์›” 26์ผ  ยท  55์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: socketio/socket.io

์›ํ•˜๋Š” ์ž‘์—…:

  • [x] ๋ฒ„๊ทธ ๋ณด๊ณ 
  • [ ] ๊ธฐ๋Šฅ ์š”์ฒญ

ํ˜„์žฌ ํ–‰๋™

์†Œ์ผ“์„ ์—ฐ๊ฒฐ๋œ ์ƒํƒœ๋กœ ๋‘๊ณ  ๋‚ด ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋‹ค๋ฅธ ํ™œ๋™์„ ํ•˜์ง€ ์•Š๋Š” ๋™์•ˆ socket.io ๊ธฐ๊ณ„ ๋‚ด๋ถ€(ํŠนํžˆ backo2/index.js ๋ผ์ธ 83.1)์—์„œ ๋ธŒ๋ผ์šฐ์ € ์ฝ˜์†”์—์„œ ๊ฐ„ํ—์ ์œผ๋กœ(๊ทธ๋Ÿฌ๋‚˜ ์ƒ๋‹นํžˆ ์ผ๊ด€๋˜๊ฒŒ) ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ๋ด…๋‹ˆ๋‹ค. ํ•ด๋‹น ์˜ค๋ฅ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

WebSocket is already in CLOSING or CLOSED state.

socket-io-errors

์žฌํ˜„ ๋‹จ๊ณ„(ํ˜„์žฌ ๋™์ž‘์ด ๋ฒ„๊ทธ์ธ ๊ฒฝ์šฐ)

https๋ฅผ ํ†ตํ•ด ๋™์ผํ•œ ์„œ๋ฒ„(localhost)์— ์—ฐ๊ฒฐ๋œ ํด๋ผ์ด์–ธํŠธ ์†Œ์ผ“์ด ์žˆ๋Š” ๋‘ ๊ฐœ์˜ ํƒญ์ด ์—ด๋ ค ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘ ํด๋ผ์ด์–ธํŠธ ๋ชจ๋‘ ๋ธŒ๋ผ์šฐ์ €๋‚˜ ์„œ๋ฒ„์—์„œ ์•„๋ฌด ์ผ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š๊ณ  ์œ ํœด ์ƒํƒœ์— ์žˆ์Šต๋‹ˆ๋‹ค(์—ฐ๊ฒฐ ์œ ์ง€ ํ•‘ socket.io๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—… ์ œ์™ธ). ๋‘˜ ๋‹ค ๋‹จ์ผ ์ฑ„๋„์— ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค(์„œ๋ฒ„์˜ join(..) ๋ฅผ ํ†ตํ•ด). ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํŠน๋ณ„ํ•œ ๊ฒƒ์ด ์—†์Šต๋‹ˆ๋‹ค.

์„œ๋ฒ„ ์†Œ์ผ“ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

var httpsServer = https.createServer(..);
var io = require("socket.io")(httpsServer);
io.on("connection",onSocketConnection);

๊ทธ๋ฆฌ๊ณ  ํด๋ผ์ด์–ธํŠธ์—์„œ:

socket = io();
socket.on("connect",function(){
   console.log("socket connected");
});
socket.on("disconnect",function(){
   console.log("socket disconnected");
});

์˜ˆ์ƒ๋˜๋Š” ํ–‰๋™

๋•Œ๋•Œ๋กœ ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง€๊ณ  ๋‹ค์‹œ ์—ฐ๊ฒฐ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜์ง€๋งŒ ์—ฐ๊ฒฐ์„ ํ†ตํ•ด ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์„ ๋•Œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๊ฐ€์งœ JS ์˜ˆ์™ธ๋Š” ๊ธฐ๋Œ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์„ค์ •

  • OS: ๋งฅ OSX
  • ๋ธŒ๋ผ์šฐ์ €: Chrome 66, ๋…ธ๋“œ 10.2.1
  • socket.io ๋ฒ„์ „: 2.1.1

๊ธฐํƒ€ ์ •๋ณด(์˜ˆ: ์Šคํƒ ์ถ”์ , ๊ด€๋ จ ๋ฌธ์ œ, ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ์ œ์•ˆ)

ํ™•์žฅ๋œ ์Šคํƒ ์ถ”์ :

index.js:83 WebSocket is already in CLOSING or CLOSED state.
(anonymous) @ index.js:83
e.encodePacket @ index.js:83
(anonymous) @ index.js:83
r.write @ index.js:83
r.send @ index.js:83
r.flush @ index.js:83
r.sendPacket @ index.js:83
r.ping @ index.js:83
(anonymous) @ index.js:83
setTimeout (async)
r.setPing @ index.js:83
r.onPacket @ index.js:83
(anonymous) @ index.js:83
r.emit @ index.js:83
r.onPacket @ index.js:83
r.onData @ index.js:83
ws.onmessage @ index.js:83

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๊ธฐ๋ณธ pingTimeout์ด 60000(v2.0.4)์—์„œ 5000(v2.1.0+)์œผ๋กœ ๋ณ€๊ฒฝ๋˜์–ด Chrome๊ณผ ๊ฐ™์€ ์ผ๋ถ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ตœ์‹  v2.2.0์„ ํฌํ•จํ•˜์—ฌ v2.1.0+์—์„œ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„œ๋ฒ„์˜ ๊ธฐ๋ณธ pingTimeout์„ ํฐ ๊ฐ’์œผ๋กœ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

const http = require('http');
const server = http.createServer();
const io = require('socket.io')(server, {
  pingTimeout: 60000,
});

๋˜๋Š”

const io = require('socket.io')();
const http = require('http');
const server = http.createServer();
io.attach(server, {
  pingTimeout: 60000,
});

๋ชจ๋“  55 ๋Œ“๊ธ€

์™„์ „ํžˆ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์ฝ”๋“œ๊ฐ€ ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด Chrome์—์„œ๋งŒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋ชจ์งˆ๋ผ๋Š” ๊นจ๋—ํ•ฉ๋‹ˆ๋‹ค. ํฌ๋กฌ์—์„œ ์ด ์˜ค๋ฅ˜๋Š” ๊ณ„์†ํ•ด์„œ ๋น„๊ฐ€ ๋‚ด๋ฆฌ๊ณ  ๋‚ด๊ฐ€ ๊ฐ€์ง„ ๋ชจ๋“  ์ฑ„ํŒ…์„ ๋ณต์ œํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค
socket.on('disconnect', () =>{ socket.disconnect(); });
์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ์˜ ์—ฐ๊ฒฐ์„ ๋Š์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ €์žฅ์†Œ https://github.com/antoniab123456/Chat_app

์—ฌ๊ธฐ์„œ๋„ ๊ฐ™์€ ๋ฌธ์ œ
image

๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์œ ํœด ์ƒํƒœ์ธ ๊ฒฝ์šฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ํฌ๋กฌ๊ณผ ๋งฅ OS๋ฅผ ์‚ฌ์šฉ

์˜ˆ ์—ฌ๋Ÿฌ๋ถ„, ๋ˆ„๊ตฐ๊ฐ€ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋งˆ๋„ ๊ทธ๊ฒƒ์„ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ์ฝ”๋“œ ์ค„์ด ํ•„์š”ํ• ๊นŒ์š”?

socket.io ๋ฐ Chrome์— ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
๋งฅ OS 10.13.5
Chrome ๋ฒ„์ „ 67.0.3396.87(๊ณต์‹ ๋นŒ๋“œ)(64๋น„ํŠธ)
๋…ธ๋“œ: 10.3.0
์ต์Šคํ”„๋ ˆ์Šค: 4.16.3
socket.io: 2.1.1

Firefox์—์„œ๋Š” ๋ชจ๋“  ๊ฒƒ์ด ์ •์ƒ์ž…๋‹ˆ๋‹ค.

์•„๋ž˜ ์˜ค๋ฅ˜ ์„ธ๋ถ€์ •๋ณด:

index.js:83 WebSocket is already in CLOSING or CLOSED state.
(anonymous) | @ | index.js:83
ย  | e.encodePacket | @ | index.js:83
ย  | (anonymous) | @ | index.js:83
ย  | r.write | @ | index.js:83
ย  | r.send | @ | index.js:83
ย  | r.flush | @ | index.js:83
ย  | r.sendPacket | @ | index.js:83
ย  | r.ping | @ | index.js:83
ย  | (anonymous) | @ | index.js:83
ย  | setTimeout (async) | ย  | ย 
ย  | r.setPing | @ | index.js:83
ย  | r.onPacket | @ | index.js:83
ย  | (anonymous) | @ | index.js:83
ย  | r.emit | @ | index.js:83
ย  | r.onPacket | @ | index.js:83
ย  | r.onData | @ | index.js:83
ย  | ws.onmessage | @ | index.js:83

index.js:83์„ ํด๋ฆญํ•˜๋ฉด ์ด ๋ชจ๋“ˆ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

/**
 * Expose `Backoff`.
 */

module.exports = Backoff;

/**
 * Initialize backoff timer with `opts`.
 *
 * - `min` initial timeout in milliseconds [100]
 * - `max` max timeout [10000]
 * - `jitter` [0]
 * - `factor` [2]
 *
 * <strong i="16">@param</strong> {Object} opts
 * <strong i="17">@api</strong> public
 */

function Backoff(opts) {
  opts = opts || {};
  this.ms = opts.min || 100;
  this.max = opts.max || 10000;
  this.factor = opts.factor || 2;
  this.jitter = opts.jitter > 0 && opts.jitter <= 1 ? opts.jitter : 0;
  this.attempts = 0;
}

/**
 * Return the backoff duration.
 *
 * <strong i="18">@return</strong> {Number}
 * <strong i="19">@api</strong> public
 */

Backoff.prototype.duration = function(){
  var ms = this.ms * Math.pow(this.factor, this.attempts++);
  if (this.jitter) {
    var rand =  Math.random();
    var deviation = Math.floor(rand * this.jitter * ms);
    ms = (Math.floor(rand * 10) & 1) == 0  ? ms - deviation : ms + deviation;
  }
  return Math.min(ms, this.max) | 0;
};

/**
 * Reset the number of attempts.
 *
 * <strong i="20">@api</strong> public
 */

Backoff.prototype.reset = function(){
  this.attempts = 0;
};

/**
 * Set the minimum duration
 *
 * <strong i="21">@api</strong> public
 */

Backoff.prototype.setMin = function(min){
  this.ms = min;
};

/**
 * Set the maximum duration
 *
 * <strong i="22">@api</strong> public
 */

Backoff.prototype.setMax = function(max){
  this.max = max;
};

/**
 * Set the jitter
 *
 * <strong i="23">@api</strong> public
 */

Backoff.prototype.setJitter = function(jitter){
  this.jitter = jitter;
};




//////////////////
// WEBPACK FOOTER
// ./~/backo2/index.js
// module id = 41
// module chunks = 0

83ํ–‰์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

this.jitter = jitter;

๋‚˜๋Š” backo2.js์™€ 83ํ–‰์— ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ ๋‚ด ์˜ค๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
index.js:83 ์žกํžˆ์ง€ ์•Š์€ TypeError: 'FileReader'์—์„œ 'readAsArrayBuffer' ์‹คํ–‰ ์‹คํŒจ: ๋งค๊ฐœ๋ณ€์ˆ˜ 1์ด 'Blob' ์œ ํ˜•์ด ์•„๋‹™๋‹ˆ๋‹ค.
n์—์„œ (index.js:83)
n์—์„œ (index.js:83)
n์—์„œ (index.js:83)
n์—์„œ (index.js:83)
n์—์„œ (index.js:83)
n์—์„œ (index.js:83)
Object.e.removeBlobs์—์„œ(index.js:83)
s์—์„œ (index.js:83)
r.encode์—์„œ(index.js:83)
r.packet์—์„œ(index.js:83)
๋‹ค๋ฅธ ๊ฒƒ๋“ค์€ ๊ฑฑ์ •ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๋ชจ๋‘ this.jitter = jitter; ์ธ 83ํ–‰์— ์žˆ์Šต๋‹ˆ๋‹ค.
๊ตฌ๊ธ€์— ์†”๋ฃจ์…˜์ด ์—†์–ด์„œ ๋„ˆ๋ฌด ์งœ์ฆ๋‚˜๋„ค์š”.

์ž„์‹œ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์€ ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? @antoniab123456 ์ฑ„ํŒ… ์•ฑ์ด ์ฑ„ํŒ…์„ ๋ณต์ œํ•˜์ง€ ์•Š๋„๋ก ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์—ˆ๋‚˜์š”? ๊ทธ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ๋˜‘๊ฐ™์€ ์ผ์„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์„ค์ •
OS: ๋งฅ OSX
๋ธŒ๋ผ์šฐ์ €: Chrome 67.0.3396.99(๊ณต์‹ ๋นŒ๋“œ)(64๋น„ํŠธ)
๋…ธ๋“œ v10.5.0
์†Œ์ผ“.io v2.1.1

ํฌ๋กฌ์—์„œ ์–ธ๊ธ‰๋œ @getify ์˜ ์ •ํ™•ํ•œ ๋ฌธ์ œ์— ์ง๋ฉดํ•ด ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ฌด๋„ ์ด๊ฒƒ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์Šต๋‹ˆ๊นŒ?

๊ฐ™์€ ๋ฌธ์ œ. ๋ˆ„๊ตฐ๊ฐ€ ์ด๊ฒƒ์— ์‘๋‹ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ฐ™์€ ๋ฌธ์ œ.

์„ค์ •
OS: ๋งฅ OSX
๋ธŒ๋ผ์šฐ์ €: Chrome 67.0.3396.99(๊ณต์‹ ๋นŒ๋“œ)(64๋น„ํŠธ), ๋…ธ๋“œ 9.6.1
socket.io ๋ฒ„์ „: 2.1.1

@19smitgr idk '๊ฐ™์€ ํ™”๋ฉด์—์„œ ์ค‘๋ณต ๋ฉ”์‹œ์ง€'๋ฅผ ์˜๋ฏธํ•˜๋Š” ๊ฒฝ์šฐ ๋Œ€์‹  ๋ฐฉ์†ก์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์ฃผ์ œ์—์„œ ๋ฒ—์–ด๋‚œ ์†Œ๋ฆฌ '์ค‘๋ณต ์ฑ„ํŒ…'์ด ์˜๋ฏธํ•˜๋Š” ๋ฐ”๊ฐ€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

@kino2007 ์ฑ„ํŒ… ์•ฑ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋‚˜๋Š” ์‹ค์ œ๋กœ ๋ฉ€ํ‹ฐ ํ”Œ๋ ˆ์ด ๊ฒŒ์ž„์—์„œ ์›น ์†Œ์ผ“์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์›น ์†Œ์ผ“์€ ์—ฐ๊ฒฐ ํ•ด์ œ ๋ฉ”์‹œ์ง€๋ฅผ๋ฐ›์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ชจ๋“  ์‚ฌ๋žŒ์ด ๋งํ•˜๋Š” ์ž„์˜์˜ ์˜ค๋ฅ˜๋กœ ์ธํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ์—ฐ๊ฒฐ์„ ๋Š์—ˆ๋‹ค๊ฐ€ ๋‹ค์‹œ ์—ฐ๊ฒฐํ•˜๋ฉด ์บ๋ฆญํ„ฐ์—๊ฒŒ ์ƒˆ ์†Œ์ผ“ ID๋ฅผ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค. ์ด์ „ ์†Œ์ผ“ ID๋ฅผ ๊ฐ€์ง„ ์ด์ „ ์Šคํ”„๋ผ์ดํŠธ๋Š” "์—ฐ๊ฒฐ ํ•ด์ œ" ๋ฉ”์‹œ์ง€ ๋Œ€์‹  "์ „์†ก ๋‹ซ๊ธฐ" ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์•˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ญ์ œ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์ด ๋•Œ "์ „์†ก ์ข…๋ฃŒ" ๋ฉ”์‹œ์ง€๊ฐ€ ๋‚˜ํƒ€๋‚˜๋„ "์—ฐ๊ฒฐ ํ•ด์ œ" ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์€ ๊ฒƒ์ฒ˜๋Ÿผ ํ˜„์žฌ ์‚ฌ์šฉ์ž ๋ชฉ๋ก์—์„œ ํ•ด๋‹น ์‚ฌ์šฉ์ž๋ฅผ ์‚ญ์ œํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ๋„ ๊ฐ™์€ ์˜ค๋ฅ˜

๋น ๋ฅธ ๊ฒ€์ƒ‰ ํ›„ backo2 ๊ฐ€ ์˜ค๋ฅ˜๋ฅผ ์ผ์œผํ‚ค๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‚˜๋Š” socket.io์˜ dev ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๊ณ  Socket.prototype.onevent๊ฐ€ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๊ณ ์ณค๋‹ค.

์ด์ „์—๋Š” ๋‹ค์Œ์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

socket.on('ping', alert);

๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์ด๊ฒƒ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ”๊ฟจ์Šต๋‹ˆ๋‹ค.

socket.on('ping', msg => {
    alert(msg);
});

๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ํšจ๊ณผ๊ฐ€ ์žˆ์—ˆ๋‹ค!

๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์—ฌ๊ธฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

socket.io & socket.io-client: "^2.1.1"
๋งฅ OS
Chrome์ด ์ตœ์‹  ์ƒํƒœ์ž…๋‹ˆ๋‹ค.
๋ฒ„์ „ 68.0.3440.106(๊ณต์‹ ๋นŒ๋“œ)(64๋น„ํŠธ)

๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ณด๋‚ด๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๋ณต์ œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

screen shot 2018-08-30 at 4 51 49 pm

๋งฅOS: 10.13.6
Socket.io: "^2.1.1"
ํฌ๋กฌ: 68.0.3440.106

@abhyuditjain socket.removeAllListeners(); ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ์ˆ˜์‹ ๊ธฐ๋ฅผ ์žฌ์„ค์ •ํ•˜์—ฌ ๋ฉ”์‹œ์ง€ ์ค‘๋ณต์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ ์ˆ˜์‹ ๊ธฐ ๋“ฑ๋ก์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์—ฌ๋Ÿฌ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๊ณ„์†๋˜๋Š” ๋ฌธ์ œ์ธ ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฉฐ ์ด์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์€ ์—†์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€๋กœ๋ถ€ํ„ฐ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@vkotu ๋ชจ๋“  ๋ฆฌ์Šค๋„ˆ๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ์—ฐ๊ฒฐ์ด ๋Š๊ธธ ๋•Œ ์†Œ์ผ“์ด ์„œ๋ฒ„์— ๋‹ค์‹œ ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

websocket-node๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ณ  ์˜ค๋ฅ˜ ์—†์ด ์ž‘๋™ํ•˜๋ฉฐ ์ด๋ฅผ ์œ„ํ•ด ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
https://codeburst.io/why-you-don-t-need-socket-io-6848f1c871cd
https://medium.com/@martin.sikora/node -js-websocket-simple-chat-tutorial-2def3a841b61
https://www.npmjs.com/package/websocket

๊ด‘๊ณ ๊ฐ€ ์•„๋‹ˆ๋ผ ๋„์›€์ด ๋  ๋ฟ์ž…๋‹ˆ๋‹ค. ์ด ์˜ค๋ฅ˜์— ๋Œ€ํ•œ ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ์ง€ ์•Š๋Š” ํ•œ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. DDD it's been going on months05.09.2018, 13:15, "Abhyudit Jain" [email protected] :@antoniab123456 ์ด ํŽ˜์ด์ง€๋Š” ์ด์— ๋Œ€ํ•œ ๋ฌธ์ œ๋ฅผ ๊ฒŒ์‹œํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค ์ €์žฅ์†Œ. ์—ฌ๊ธฐ์—์„œ ๊ด‘๊ณ ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

โ€”๋‹น์‹ ์ด ์–ธ๊ธ‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ์ด๋ฉ”์ผ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ๋ณด๊ฑฐ๋‚˜ ์Šค๋ ˆ๋“œ๋ฅผ ์Œ์†Œ๊ฑฐํ•˜์‹ญ์‹œ์˜ค.

-- ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. Antonia B. ๊ณ ๊ฐ ๊ด€๋ฆฌ ์ „๋ฌธ๊ฐ€ @amoCRM Global

2.0.3 ๋กœ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œํ•˜๋ฉด ์ด ๋ฌธ์ œ๊ฐ€ "์ˆ˜์ •"๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@cozuya ๊ฐ€ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค. ํšจ๊ณผ๊ฐ€ ์žˆ์—ˆ๋Š”์ง€ ์•Œ๋ ค๋“œ๋ฆฝ๋‹ˆ๋‹ค!

2.0.3 ๋กœ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œํ•˜๋ฉด ์ด ๋ฌธ์ œ๊ฐ€ "์ˆ˜์ •"๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํŠธ๋ฆญ์„ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. 4๋ถ„ ๋™์•ˆ ํ…Œ์ŠคํŠธํ–ˆ์œผ๋ฉฐ ์˜ค๋ฅ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์–ผ๋งˆ๋‚˜ ์œ ์ง€๋˜๋Š”์ง€ ๋ณด์ž!

@cozuya ์˜ฌ๋ ค ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

2.1.1์—์„œ ๋™์ผํ•œ ์˜ค๋ฅ˜

2.0.3์œผ๋กœ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œํ•˜๋ฉด ์ด ๋ฌธ์ œ๊ฐ€ "์ˆ˜์ •"๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

2.0.3์€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค! @cozuya ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

2.1.1 ์—ฌ์ „ํžˆ ๋™์ผํ•œ ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•‘ ๋ฐ ์‹œ๊ฐ„ ์ดˆ๊ณผ๋ฅผ ๋Š˜๋ฆฌ๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ์•„๋ฌด ๊ฒƒ๋„ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

ํฌ๋กฌ์—์„œ v2.1.1๊ณผ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ๊ณ  ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์˜ค๋žซ๋™์•ˆ ์œ ํœด ์ƒํƒœ์ผ ๋•Œ(์•ฝ 20-30๋ถ„)

2.1.1 ์—ฌ์ „ํžˆ ๋™์ผํ•œ ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•‘ ๋ฐ ์‹œ๊ฐ„ ์ดˆ๊ณผ๋ฅผ ๋Š˜๋ฆฌ๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ์•„๋ฌด ๊ฒƒ๋„ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

v 2.0.3์œผ๋กœ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œ

๋‚˜๋Š” 2.0.4์—์„œ socket.io๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ๋Š”๋ฐ ์ •์ƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

pingTimeout์ด 60000(v2.0.4)์—์„œ 5000(v2.1.1)์œผ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Œ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

pingTimeout์„ 10000์ดˆ์™€ ๊ฐ™์ด ๋” ํฐ ์ˆซ์ž๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋น„ํ™œ์„ฑ ํƒญ์— ์Šค๋กœํ‹€์ด ์žˆ๋Š” ๋ธŒ๋ผ์šฐ์ € ์œ ํœด ์ƒํƒœ์™€ ๊ด€๋ จ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๊นŒ?

๋‹ค์šด๊ทธ๋ ˆ์ด๋“œ๋„ ํ•ด์•ผ ํ–ˆ๋‹ค. ํฌ๋กฌ๊ณผ ์‚ฌํŒŒ๋ฆฌ์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. OSX์—์„œ ํฌ๋กฌ.

๋‚˜๋Š” socket.removeAllListeners(); ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  socket.off("whatever") ๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ๋น„๊ธฐ์ˆ ์  ์ฒญ์ทจ์ž์— ๋Œ€ํ•ด $#$1$# "disconnect" ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ € ์ฝ˜์†”์˜ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋Š” ์งœ์ฆ๋‚˜์ง€๋งŒ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œํ•  ๊ฐ€์น˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

์•„๋ฌด ์ฃผ์˜๋„ ์—†์ด ์ด ๋ฌธ์ œ๋ฅผ ๋ณด๋Š” ๊ฒƒ์ด ์‹ค๋ง์Šค๋Ÿฝ๋‹ค๊ณ  ๋ง์”€๋“œ๋ฆฌ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. 6๊ฐœ์›”์ด๊ณ  ๊ณ„์‚ฐ ์ค‘์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋‹ค์‹œ ์—ฐ๊ฒฐํ•˜๋Š” ์ด์œ ๋Š” ํ•‘ ์‹œ๊ฐ„ ์ดˆ๊ณผ์ž…๋‹ˆ๋‹ค. ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œ๋ฅผ ํ•ด๋„ ์—ฌ์ „ํžˆ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ด‘๋ฒ”์œ„ํ•œ ์ฝ”๋“œ ๊ธฐ๋ฐ˜์„ ๊ฐ–๊ณ  ์žˆ์ง€๋งŒ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด์„œ๋Š” ์ „ํ˜€ ๊ด€์‹ฌ์„ ๋‘์ง€ ์•Š๋Š” ๊ฑฐ๋Œ€ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ „์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค!

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ณง ๊ทธ๊ฒƒ์„ ์–ป์„ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค!

๋‚ด iPhone์—์„œ ๋ณด๋‚ธ

2018๋…„ 11์›” 28์ผ ์˜คํ›„ 2์‹œ 14๋ถ„์— HorseBadorties [email protected] ์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. OSX์—์„œ ํฌ๋กฌ.

๋‚˜๋Š” socket.removeAllListeners()๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ "์—ฐ๊ฒฐ ํ•ด์ œ" ๋“ฑ์„ ์ œ์™ธํ•œ ๋ชจ๋“  ๋น„๊ธฐ์ˆ ์  ์ฒญ์ทจ์ž์— ๋Œ€ํ•ด์„œ๋Š” socket.off("๋ฌด์—‡์ด๋“ ")์ž…๋‹ˆ๋‹ค. ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ € ์ฝ˜์†”์˜ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋Š” ์งœ์ฆ๋‚˜์ง€๋งŒ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œํ•  ๊ฐ€์น˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

์•„๋ฌด ์ฃผ์˜๋„ ์—†์ด ์ด ๋ฌธ์ œ๋ฅผ ๋ณด๋Š” ๊ฒƒ์ด ์‹ค๋ง์Šค๋Ÿฝ๋‹ค๊ณ  ๋ง์”€๋“œ๋ฆฌ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. 6๊ฐœ์›”์ด๊ณ  ๊ณ„์‚ฐ ์ค‘์ž…๋‹ˆ๋‹ค.

โ€”
๋‹น์‹ ์ด ๋Œ“๊ธ€์„ ๋‹ฌ์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ๋ณด๊ฑฐ๋‚˜ ์Šค๋ ˆ๋“œ๋ฅผ ์Œ์†Œ๊ฑฐํ•˜์„ธ์š”.

๊ฐ™์€ ๋ฌธ์ œ .... ์•„์ง ์ด์— ๋Œ€ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์ด ์—†๋‹ค๋Š” ์‚ฌ์‹ค์— ๋†€๋ž์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š”์ด ๋ฌธ์ œ์— ๋ถ€๋”ช์ณค๋‹ค. ์ œ ๊ฒฝ์šฐ์—๋Š” ping timeout ๋กœ ์ธํ•ด ์—ฐ๊ฒฐ์ด ๋Š์–ด์กŒ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํด๋ผ์ด์–ธํŠธ ์ธก์ด ํ•‘์— ์‘๋‹ตํ•˜์ง€ ์•Š๋Š” ์ด์œ ์— ๋Œ€ํ•ด์„œ๋Š” ์šด์ด ์—†์Šต๋‹ˆ๋‹ค.

io.on('connection', function(socket) {
  socket.on('disconnect', function(reason) {
  console.log(`Socket disconnected for: ${reason}`);
  }
});

https://socket.io/docs/server-api/#Event -%E2%80%98disconnect%E2%80%99 ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง„ ์ด์œ  ๋ชฉ๋ก์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋” ๋งŽ์€ ๋””๋ฒ„๊น…:
image
ํ•œ ๊ฐ€์ง€ ๊ด€์ฐฐ์€ ํด๋ผ์ด์–ธํŠธ์˜ ping ์ด๋ฒคํŠธ๊ฐ€ ๋งˆ์ง€๋ง‰์—์„œ +30s ๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ ๋Š๊น€์„ ๋ณผ ๋•Œ๋งˆ๋‹ค ๊ธฐ๋ณธ ํ•˜ํŠธ๋น„ํŠธ ๊ฐ„๊ฒฉ + ํ•‘ ์‹œ๊ฐ„ ์ดˆ๊ณผ์ธ 30s+ . +26s , +28s ๋ฐ +29s ๊ฐ€ ์—ฐ๊ฒฐ ํ•ด์ œ ์—†์ด ํ‘œ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
Safari์™€ ๋น„๊ตํ•  ๋•Œ Safari๋Š” 25s ๋งˆ๋‹ค ํ•‘ํ•  ๋•Œ ๋” ์ผ๊ด€์ ์ด์—ˆ๊ณ  ์—ฐ๊ฒฐ ๋Š๊น€์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ pingTimeout์ด 60000(v2.0.4)์—์„œ 5000(v2.1.0+)์œผ๋กœ ๋ณ€๊ฒฝ๋˜์–ด Chrome๊ณผ ๊ฐ™์€ ์ผ๋ถ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ตœ์‹  v2.2.0์„ ํฌํ•จํ•˜์—ฌ v2.1.0+์—์„œ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„œ๋ฒ„์˜ ๊ธฐ๋ณธ pingTimeout์„ ํฐ ๊ฐ’์œผ๋กœ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

const http = require('http');
const server = http.createServer();
const io = require('socket.io')(server, {
  pingTimeout: 60000,
});

๋˜๋Š”

const io = require('socket.io')();
const http = require('http');
const server = http.createServer();
io.attach(server, {
  pingTimeout: 60000,
});

์™œ 5000์€ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ๋‚ด ๋กœ์ปฌ ๊ฐœ๋ฐœ ์„œ๋ฒ„์—์„œ ์ด ๋ฌธ์ œ๋ฅผ ๋ณด๊ณ  ์žˆ์œผ๋ฉฐ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ํ•ด๋‹น ์ž„๊ณ„๊ฐ’ ๋ฏธ๋งŒ์ธ ๊ฒƒ์ด ๊ฐ€์žฅ ํ™•์‹คํ•ฉ๋‹ˆ๋‹ค. 5000ms๋Š” ํ•ฉ๋ฆฌ์ ์ธ ์‹œ๊ฐ„ ์ดˆ๊ณผ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ํƒ๊ตฌ ์‹œ์Šคํ…œ ์ž์ฒด์— ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ๊ฐ™๊ณ , ๋‚ฎ์ถ”์—ˆ์„ ๋•Œ๋งŒ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•œ Thx @getify (์ €๋Š” socket.io v2.2.0์— ์žˆ์Šต๋‹ˆ๋‹ค)

๋˜ํ•œ ์ด๊ฒƒ์„ ๊ฒฝํ—˜ํ•˜๋Š” ์‚ฌ๋žŒ์—๊ฒŒ - ME TOO COMMENTS DON'T HELP :-) ์ง€์ง€๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด ์—„์ง€ ์†๊ฐ€๋ฝ์œผ๋กœ ๋ฌธ์ œ์— ํˆฌํ‘œํ•˜์‹ญ์‹œ์˜ค ๐Ÿ‘

pingTimeout ๋ฐœ๊ฒฌ์— ๋Œ€ํ•ด @omardoma ์—๊ฒŒ โ€‹โ€‹๊ฐ์‚ฌ๋“œ๋ฆฌ๋ฉฐ ping/pong ์ด๋ฒคํŠธ ์‹œ์Šคํ…œ์„ ์กฐ์‚ฌํ•ด์•ผ ํ•œ๋‹ค๋Š” @LunarMist ์˜ ์˜๊ฒฌ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

Chrome, Firefox ๋ฐ Safari(๋ชจ๋‘ MacOS์—์„œ)๋กœ ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๋น„ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

Chrome ๋ฐ Safari ๋Š” ๋ชจ๋‘ ๋‹ค๋ฅธ ๋™์ž‘ ๋ฐ ์ œ์•ฝ ์กฐ๊ฑด์œผ๋กœ ws ํ™œ๋™์„ ์กฐ์ ˆํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

  • Chrome, ํƒญ์— ํฌ์ปค์Šค๊ฐ€ ์žˆ์„ ๋•Œ ์•ฝ 5๋ถ„ ๋™์•ˆ ๋น„ํ™œ์„ฑ ์ƒํƒœ ํ›„ ๋˜๋Š” ํƒญ์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์ด๋™ํ•˜๋Š” ์ฆ‰์‹œ. ์ด๊ฒƒ์€ ํฌ๋กฌ ํŒ€์—์„œ ์˜๋„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค(https://developers.google.com/web/updates/2017/03/background_tabs).
  • Safari, ์•ฑ ํฌ์ปค์Šค๊ฐ€ ๋‹ค๋ฅธ ๋ฐ์Šคํฌํƒ‘ ์•ฑ(MacOS)์œผ๋กœ ๋ณ€๊ฒฝ๋˜๊ฑฐ๋‚˜ ํƒญ์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์ด๋™ํ•  ๋•Œ ๊ฑฐ์˜ ์ฆ‰์‹œ. ๊ด€๋ จ #2924
  • Firefox, *์ด ์Šค๋ ˆ๋“œ์—์„œ ์–ธ๊ธ‰๋œ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์†”๋ฃจ์…˜

pingTimeout & pingInterval ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฉด์„œ ์ด 3๊ฐ€์ง€ ๋ธŒ๋ผ์šฐ์ € ๋ชจ๋‘์—์„œ ๋ช‡ ์‹œ๊ฐ„ ๋™์•ˆ ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ฐพ์€ ํ•ด๊ฒฐ์ฑ…:

  1. pingTimeout >= 30000 ms ์„ค์ •

    • ๋˜๋Š” -

  2. pingInterval <= 10000 ms ์„ค์ •

pingTimeout = 30000 ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์€ ์†”๋ฃจ์…˜์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ pingInterval ๋Š” 25000 ms์ด๊ณ  ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ping์„ ๋ณด๋‚ด๋Š” ๋นˆ๋„๋ฅผ 10์ดˆ๋งˆ๋‹ค ๋Š˜๋ฆฌ๋Š” ๊ฒƒ์€ _at scale_ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด ๋„ˆ๋ฌด ์ˆ˜๋‹ค์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


v2.1์—์„œ 60000 ์—์„œ ๋ณ€๊ฒฝ๋œ ํ˜„์žฌ ๊ธฐ๋ณธ๊ฐ’์ธ 5000 ms์—์„œ ๊ธฐ๋ณธ๊ฐ’ pingTimeout ์„ 30000 ๋กœ ๋Š˜๋ฆฌ๋Š” ๋ฐ ์ฐฌ์„ฑํ•˜๋Š” @darrachequesne ๋˜๋Š” ๋‹ค๋ฅธ repo ๊ตฌ์„ฑ์›์ž…๋‹ˆ๊นŒ? 60000 ๋ฐ€๋ฆฌ์ดˆ?

์ž์‹ ์˜ ๋Œ“๊ธ€์— ๋ฐ˜์‘ํ•˜๋Š” ๊ฒƒ๋„ ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„์— ping์„ ๋ณด๋‚ด๋Š” ๊ฒƒ์ด๋ฉฐ ๊ทธ ๋ฐ˜๋Œ€๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

ํ˜„์žฌ ๋ฒ„์ „์˜ socket.io๊ฐ€ ํด๋ผ์ด์–ธํŠธ ์ธก์˜ setTimeout์— ์˜์กดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ˆ์ƒ๋Œ€๋กœ ์•ˆ์ •์ ์ด์ง€ ์•Š์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

pingTimeout ๋ฅผ ๋Š˜๋ฆฌ๋ฉด ๋ฌธ์ œ๊ฐ€ ์ผ์‹œ์ ์œผ๋กœ ํ•ด๊ฒฐ๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ v3์—์„œ๋Š” ์„œ๋ฒ„ -> ํด๋ผ์ด์–ธํŠธ(ํ˜„์žฌ ํด๋ผ์ด์–ธํŠธ -> ์„œ๋ฒ„ ๋Œ€์‹ )์—์„œ ping/pong์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

_socket.on('ํ•‘', () => {
socket.emit(๋ฐ์ดํ„ฐ);
});_

@crobinson42 ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! Ping ์‹œ๊ฐ„ ์ดˆ๊ณผ ์†”๋ฃจ์…˜์ด ์ €์—๊ฒŒ ํšจ๊ณผ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹จ์ง€ ๊ทธ ํ•ด๊ฒฐ์ฑ…์— ๋Œ€ํ•ด ์•ฝ๊ฐ„์˜ ์šฐ๋ ค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ์ˆœ๊ฐ„์— ์ธํ„ฐ๋„ท ์—ฐ๊ฒฐ์ด ๋Š๊ธด ๊ฒฝ์šฐ ์—ฐ๊ฒฐ ํ•ด์ œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋ฐ ์ตœ๋Œ€ 30์ดˆ๊ฐ€ ์†Œ์š”๋˜๋ฉฐ ์ผ๋ถ€ ์•ฑ์˜ ๊ฒฝ์šฐ ๋„ˆ๋ฌด ๋งŽ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ์šฉ์ž๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์ง€ ์•Š์„ ๋•Œ ํ…์ŠคํŠธ ์ž…๋ ฅ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ ค๋Š” ์ฑ„ํŒ… ์•ฑ.

์ด ๊ฒฝ์šฐ ping ๊ฐ„๊ฒฉ์„ ๋Š˜๋ฆฌ๋ฉด ์ž‘์—…์ด ์ˆ˜ํ–‰๋˜์ง€๋งŒ ๋น„์šฉ์ด ๋งŽ์ด ๋“ญ๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๋ฉด ์ €ํฌ์—๊ฒŒ ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค. ์ œ ๋ฒ„์ „์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

"socket.io": "2.2.0",
"socket.io-adapter": "~1.1.1",
"socket.io-client": "2.2.0",
"socket.io-parser": "~3.2.0",
"socket.io-redis": "^5.2.0",

๋‚ด ์ฝ”๋“œ:
์„œ๋ฒ„, {
๊ฒฝ๋กœ: '/socket.io',
์„œ๋ธŒํด๋ผ์ด์–ธํŠธ: ์ฐธ,
// ์•„๋ž˜๋Š” engine.IO ์˜ต์…˜์ž…๋‹ˆ๋‹ค.
ํ•‘ ๊ฐ„๊ฒฉ: 40000,
ํ•‘ํƒ€์ž„์•„์›ƒ: 25000,
upgradeTimeout: 30000, // ๊ธฐ๋ณธ๊ฐ’์€ 10000ms, 20k ์ด์ƒ์œผ๋กœ ๋ณ€๊ฒฝํ•ด ๋ณด์„ธ์š”.
์—์ด์ „ํŠธ: ๊ฑฐ์ง“,
์ฟ ํ‚ค: ๊ฑฐ์ง“,
๊ฑฐ๋ถ€ ๊ถŒํ•œ ์—†์Œ: ๊ฑฐ์ง“,
์žฌ์—ฐ๊ฒฐ ์ง€์—ฐ: 1000,
reconnectionDelayMax: 5000
}

๋‚ด ํด๋ผ์ด์–ธํŠธ:

์žฌ์—ฐ๊ฒฐ: ์‚ฌ์‹ค,
์žฌ์—ฐ๊ฒฐ ์ง€์—ฐ: 1000,
์žฌ์—ฐ๊ฒฐ ์ง€์—ฐ ์ตœ๋Œ€: 5000,
์žฌ์—ฐ๊ฒฐ ์‹œ๋„ ํšŸ์ˆ˜: ๋ฌดํ•œ๋Œ€,
//์‚ฌ์ดํŠธ ์˜ต์…˜
์ „์†ก: ["ํด๋ง", "์›น ์†Œ์ผ“"],
๋ณด์•ˆ: ์‚ฌ์‹ค,
๊ฑฐ๋ถ€ ๊ถŒํ•œ ์—†์Œ: ๊ฑฐ์ง“,
forceNew: ์‚ฌ์‹ค,
์‹œ๊ฐ„ ์ดˆ๊ณผ: 60000

์•ˆ๋…•ํ•˜์„ธ์š” ํŒŒ์ด์ž”์ž…๋‹ˆ๋‹ค.
์ด ์ฝ”๋“œ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
** ๋‹น์‹ ์ด ์ค€ ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฒ„์ „์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค..

์„œ๋ฒ„ ์ธก - ์ฝ”๋“œ:

const ์„œ๋ฒ„ = require('http').createServer();
const io = require('socket.io')(์„œ๋ฒ„, {
// ๊ฒฝ๋กœ: '/socket.io',
์„œ๋ธŒํด๋ผ์ด์–ธํŠธ: ์ฐธ,

pingInterval: 40000,
pingTimeout: 25000,
upgradeTimeout: 21000, // default value is 10000ms, try changing it to 20k or more
agent: false,
cookie: false,
rejectUnauthorized: false,
reconnectionDelay: 1000,
reconnectionDelayMax: 5000

});

io.on('์—ฐ๊ฒฐ', ๊ธฐ๋Šฅ(์†Œ์ผ“) {
socket.emit('ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค', { ๋ฉ”์‹œ์ง€: 'ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!', id: socket.id });
socket.on('์ˆœ์ผ', console.log);
});

server.listen(3000);

ํด๋ผ์ด์–ธํŠธ ์ธก ์ฝ”๋“œ:

var ํด๋ผ์ด์–ธํŠธ = require("socket.io-client");
var ์†Œ์ผ“ = client.connect("http://localhost:3000", {
์žฌ์—ฐ๊ฒฐ: ์‚ฌ์‹ค,
์žฌ์—ฐ๊ฒฐ ์ง€์—ฐ: 1000,
์žฌ์—ฐ๊ฒฐ ์ง€์—ฐ ์ตœ๋Œ€: 5000,
์žฌ์—ฐ๊ฒฐ ์‹œ๋„ ํšŸ์ˆ˜: ๋ฌดํ•œ๋Œ€,
์ „์†ก: ["์›น ์†Œ์ผ“"],
๋ณด์•ˆ: ๊ฑฐ์ง“,
๊ฑฐ๋ถ€ ๊ถŒํ•œ ์—†์Œ: ๊ฑฐ์ง“,
forceNew: ์‚ฌ์‹ค,
์‹œ๊ฐ„ ์ดˆ๊ณผ: 6000
});

์†Œ์ผ“.์—ฐ๊ฒฐ();
socket.emit('์ˆœ์ผ', {
๋ฐ์ดํ„ฐ: '์•ˆ๋…•ํ•˜์„ธ์š”'
});
socket.on('ํ™˜์˜', ํ•จ์ˆ˜(๋ฐ์ดํ„ฐ) {
console.log(๋ฐ์ดํ„ฐ)
socket.emit('์ˆœ์ผ', {
๋ฐ์ดํ„ฐ: 'ํ™”์ด์ž”',
์•„์ด๋””: data.id
});

socket.disconnect();

});

๋ฌธ์•ˆ ์ธ์‚ฌ
์ˆ˜๋‹ ์•ผ๋‹ค๋ธŒ

2019๋…„ 5์›” 9์ผ ์˜คํ›„ 4์‹œ 5๋ถ„์— Faizan Zahid [email protected] ์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

์žฌ์—ฐ๊ฒฐ: ์‚ฌ์‹ค,
์žฌ์—ฐ๊ฒฐ ์ง€์—ฐ: 1000,
์žฌ์—ฐ๊ฒฐ ์ง€์—ฐ ์ตœ๋Œ€: 5000,
์žฌ์—ฐ๊ฒฐ ์‹œ๋„ ํšŸ์ˆ˜: ๋ฌดํ•œ๋Œ€,
//์‚ฌ์ดํŠธ ์˜ต์…˜
์ „์†ก: ["ํด๋ง", "์›น ์†Œ์ผ“"],
๋ณด์•ˆ: ์‚ฌ์‹ค,
๊ฑฐ๋ถ€ ๊ถŒํ•œ ์—†์Œ: ๊ฑฐ์ง“,
forceNew: ์‚ฌ์‹ค,
์‹œ๊ฐ„ ์ดˆ๊ณผ: 60000

๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋  ๋•Œ๊นŒ์ง€ ๊ด€์‹ฌ์ด ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ํด๋ผ์ด์–ธํŠธ ์ธก์˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ™•๋ณดํ•˜์ง€ ๋ชปํ•˜๊ณ  ๊ณผ๋„ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์—ฌ๊ธฐ์— ๋‚˜์—ด๋œ ๋Œ€๋กœ https://apple.stackexchange.com/questions/344183/safari-12-mac-does-includeinternaldebugmenu-1-still-work , ๋จผ์ € ํ„ฐ๋ฏธ๋„ ์•ฑ์— ๋กœ์ปฌ๋กœ ์ „์ฒด ๋””์Šคํฌ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๊ณ  ํ„ฐ๋ฏธ๋„์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  • ํ„ฐ๋ฏธ๋„ ์ฐฝ์„ ์—ด๊ณ  defaults write com.apple.Safari IncludeInternalDebugMenu 1 ๋ช…๋ น์„ ๋ถ™์—ฌ๋„ฃ๊ณ  ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ์‚ฌํŒŒ๋ฆฌ๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ์— ์ƒˆ๋กœ์šด ๋””๋ฒ„๊ทธ ๋ฉ”๋‰ด๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
  • ๋””๋ฒ„๊ทธ -> ๊ธฐํƒ€ ํ”Œ๋ž˜๊ทธ์—์„œ "์•ฑ Nap ๋น„ํ™œ์„ฑํ™”" ๋ฐ "์ˆจ๊ฒจ์ง„ ํŽ˜์ด์ง€ ํƒ€์ด๋จธ ์กฐ์ ˆ ๋น„ํ™œ์„ฑํ™”" ๋‘ ํ”Œ๋ž˜๊ทธ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ณ  Safari๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๋ˆ„๊ตฌ๋“ ์ง€ Chrome ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์œผ๋ฉด ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

localhost webdev์— Safari๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๊นŒ? ๐Ÿค”

localhost webdev์— Safari๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๊นŒ? ๐Ÿค”

์‹ค์ œ๋กœ๋Š” ์•„๋‹ˆ์ง€๋งŒ ๋‚ด ์•ฑ์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด ๊ณ„์† ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง€๋Š” ๊ฒƒ์ด ์งœ์ฆ๋‚ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ 3.0์—์„œ ์ˆ˜์ •๋  ๋•Œ๊นŒ์ง€ ์ž„์‹œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ•ด๊ฒฐ์ฑ…์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ ์ค‘์— ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ๋„์›€์ด๋˜๋Š”์ง€ ๊ฒŒ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค.

์‹ค์‹œ๊ฐ„ ์˜คํ”„๋ผ์ธ ์ƒํƒœ ๋ณ€๊ฒฝ์„ ์–ป๊ธฐ ์œ„ํ•ด ๋งค์šฐ ๋‚ฎ์€ pingInterval ๋ฐ pingTimeouts๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 30์ดˆ๋กœ ์„ค์ •ํ•˜๋ฉด ํ๋ฆ„์ด ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค... ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•„๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ž˜์„œ ๋ฐฐ๊ฒฝ ๋ธŒ๋ผ์šฐ์ €์— ๊ธด ์‹œ๊ฐ„ ์ดˆ๊ณผ '์ˆ˜์ •'์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํƒญ?

์ด์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์‹ค์‹œ๊ฐ„ ์˜คํ”„๋ผ์ธ ์ƒํƒœ ๋ณ€๊ฒฝ์„ ์–ป๊ธฐ ์œ„ํ•ด ๋งค์šฐ ๋‚ฎ์€ pingInterval ๋ฐ pingTimeouts๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 30์ดˆ๋กœ ์„ค์ •ํ•˜๋ฉด ํ๋ฆ„์ด ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค... ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•„๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ž˜์„œ ๋ฐฐ๊ฒฝ ๋ธŒ๋ผ์šฐ์ €์— ๊ธด ์‹œ๊ฐ„ ์ดˆ๊ณผ '์ˆ˜์ •'์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํƒญ?

์กด์žฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด ์†Œ์ผ“์˜ ์—ฐ๊ฒฐ ํ•ด์ œ ์ด๋ฒคํŠธ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์†Œ์ผ“ ์—ฐ๊ฒฐ์ด ๋Š๊ธธ ๋•Œ ์‚ฌ์šฉ์ž๋ฅผ ์ฐพ์•„ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ์—์„œ ์˜คํ”„๋ผ์ธ์œผ๋กœ ํ‘œ์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ๋ฌธ์„œ์˜ ๊ธฐ๋ณธ๊ฐ’์ž…๋‹ˆ๋‹ค. ํ•‘์ด 25์ดˆ๋งˆ๋‹ค ์ „์†ก๋˜๊ณ  ๊ฐ ํ•‘์ด ์™„๋ฃŒ๋˜๋Š” ๋ฐ 5์ดˆ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํ•‘ํƒ€์ž„์•„์›ƒ | 5000 | ์—ฐ๊ฒฐ์ด ๋‹ซํžŒ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•˜๊ธฐ ์œ„ํ•ด ํ ํŒจํ‚ท ์—†์ด ๋ช‡ ms
-- | -- | --
ํ•‘ ๊ฐ„๊ฒฉ | 25000 | ์ƒˆ ํ•‘ ํŒจํ‚ท์„ ๋ณด๋‚ด๊ธฐ๊นŒ์ง€ ๋ช‡ ms

๋™์ผํ•œ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์ง€๋งŒ ๋‹ค๋ฅธ ์ปจํ…์ŠคํŠธ์—์„œ ์—ฌ๊ธฐ์—์„œ ๋๋‚˜๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ์„ ์œ„ํ•ด ๋‚ด ๋ฌธ์ œ์™€ ์†”๋ฃจ์…˜์„ ๋น ๋ฅด๊ฒŒ ์ž‘์„ฑํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‚ด ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ํ™”๋ฉด์„ ์ž ๊ทผ ํ›„ ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง€๋Š” Android์šฉ Chrome์— ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ฟผ๋ฆฌ ์˜ต์…˜ ์ ‘๊ทผ ๋ฐฉ์‹ ์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ๊ฒฐํ•  ๋•Œ ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ณด๋‚ด๋Š” ๋‹ค๋ฅธ ์—ฐ๊ฒฐ์—์„œ ๋™์ผํ•œ ์‚ฌ์šฉ์ž๋ฅผ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ํ† ํฐ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์„œ๋ฒ„์—์„œ ๋ฐ›์€ ์ƒˆ ํ† ํฐ์œผ๋กœ ํ† ํฐ์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

// client
io('myAppUrl', {
  query: {
    token: localStorage.getItem('myKey') || ''
  }
});

io.on('reconnect_attempt', () => {
  io.opts.query = {
    token: localStorage.getItem('myKey') || ''
  };
});

io.on('my_custom_connection_successful_event', (token) => {
  localStorage.setItem('myKey', token);
});

๋ฌธ์ œ๋Š” Android์šฉ Chrome ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์žฌ์—ฐ๊ฒฐ ์‹œ ์„œ๋ฒ„์— ๋นˆ ๋ฌธ์ž์—ด ํ† ํฐ์„ ์ „์†กํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. localStorage ์—์„œ ์ตœ์‹  ํ† ํฐ์„ ์„ค์ •ํ•˜๋„๋ก ํ•˜๋Š” 'reconnect_attempt' ๋ฆฌ์Šค๋„ˆ๋ฅผ ์ถ”๊ฐ€ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์˜ˆ์ƒํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ํด๋ผ์ด์–ธํŠธ ์ด๋ฒคํŠธ๋ฅผ ๊ธฐ๋กํ•˜๋Š” ์ฝ˜์†”๋กœ ๋ช‡ ์‹œ๊ฐ„ ๋™์•ˆ ๋””๋ฒ„๊น…ํ•œ ํ›„ ๋‹ค์‹œ ์—ฐ๊ฒฐํ•˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ 'reconnect_attempt' ์ด๋ฒคํŠธ๊ฐ€ ์ „ํ˜€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ํ™”๋ฉด ์ž ๊ธˆ์„ ํ•ด์ œํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ผ๋ จ์˜ ์ด๋ฒคํŠธ๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

  • ์—ฐ๊ฒฐ ํ•ด์ œ(์ด์œ : '์ „์†ก ์ข…๋ฃŒ')
  • ์žฌ์ ‘์†(์‹œ๋„: 1)
  • ๋‹ค์‹œ ์—ฐ๊ฒฐ
  • ํ•‘/ํ ๋‹ค์‹œ ์‹œ์ž‘

๋”ฐ๋ผ์„œ ํ† ํฐ์ด ์—ฌ์ „ํžˆ ๋นˆ ๋ฌธ์ž์—ด(์—ฐ๊ฒฐ ์‹œ ์„ค์ •๋œ ์ดˆ๊ธฐ ๊ฐ’)์ธ ์ด์œ ๋ฅผ ์„ค๋ช…ํ•˜๋Š” 'reconnect_attempt' ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ, ์ €๋ฅผ ์œ„ํ•œ ์†”๋ฃจ์…˜์€ ์ƒˆ ํ† ํฐ์œผ๋กœ ์„œ๋ฒ„์—์„œ ๋ฐ›์€ ์‚ฌ์šฉ์ž ์ง€์ • "์—ฐ๊ฒฐ ์„ฑ๊ณต" ์ด๋ฒคํŠธ์—์„œ io.opts.query ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋ฅผ ์ฆ‰์‹œ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

// client
io('myAppUrl', {
  query: {
    token: localStorage.getItem('myKey') || ''
  }
});

io.on('my_custom_connection_successful_event', (token) => {
  localStorage.setItem('myKey', token);
  io.opts.query = {
    token: token
  };
});

์ด์ œ io.opts.query ๊ฐ€ ์—ฐ๊ฒฐ ๋ฐ ๋ชจ๋“  ํ›„์† ์žฌ์—ฐ๊ฒฐ์— ์‚ฌ์šฉ๋˜๋Š” ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋ผ๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜๋ฏ€๋กœ ์›ํ•˜๋Š” ์ฆ‰์‹œ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์žฌ์—ฐ๊ฒฐ ๊ด€๋ จ ์ด๋ฒคํŠธ๋ฅผ ๊ธฐ๋‹ค๋ฆด ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

With ์ฟผ๋ฆฌ ์˜ต์…˜ ๋ฌธ์„œ๋กœ ์ธํ•ด ์•ฝ๊ฐ„ ์ž˜๋ชป๋œ ๋Š๋‚Œ์ด ๋“ญ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ทธ ์˜ˆ์—์„œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ž˜๋ชป ์ดํ•ดํ•œ ๊ฒƒ์ผ๊นŒ์š”? ๊ทธ๋Ÿฌ๋‚˜ ๋‚ด ์‚ฌ์šฉ ์‚ฌ๋ก€์™€ ์œ ์‚ฌํ•œ ๊ฒฝ์šฐ 'reconnect_attempt' ์˜ˆ์ œ ๋Œ€์‹  ๋ฌธ์„œ์—์„œ io.opts.query ๊ฐ€ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋Š” ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜์ด๊ณ  ํ˜„์žฌ ๊ฐ’์ด ๋ชจ๋“  ํ›„์† ์žฌ์—ฐ๊ฒฐ์— ์‚ฌ์šฉ๋œ๋‹ค๊ณ  ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์˜ˆ๋ฅผ ๋“ค์–ด 'refresh_token' ์‚ฌ์šฉ์ž ์ •์˜ ์ด๋ฒคํŠธ์—์„œ๋„ ํ† ํฐ์„ ์ƒˆ๋กœ ๊ณ ์น˜๊ณ  ์‹ถ์„ ๋•Œ๋งˆ๋‹ค ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์„œ ๊ฐœ์„ ์— ์ข‹์€ ์•„์ด๋””์–ด๋ผ๊ณ  ์ƒ๊ฐ๋˜๋ฉด PR์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘ํ•˜๋‹ค:
์ถ”๊ฐ€ ์กฐ์‚ฌ์—์„œ 'reconnect_attempt' ์ˆ˜์‹ ๊ธฐ๊ฐ€ ๋‚ด ์ฝ”๋“œ์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์—์„œ ์ œ๊ฑฐ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์ด ๋‚ด ์‹ค์ˆ˜๋ผ๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค... :man_facepalming: ๊ทธ๋ž˜์„œ ๋‚ด ๋กœ๊น…์—์„œ ๋ณผ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ, ์žฌ์—ฐ๊ฒฐ ์‹œ๋‚˜๋ฆฌ์˜ค์˜ ์ด๋ฒคํŠธ ์ˆœ์„œ๋Š” ์‹ค์ œ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์—ฐ๊ฒฐ ํ•ด์ œ(์ด์œ : '์ „์†ก ์ข…๋ฃŒ')
  • reconnect_attempt (์‹œ๋„: 1)
  • ์žฌ์ ‘์†(์‹œ๋„: 1)
  • ๋‹ค์‹œ ์—ฐ๊ฒฐ
  • ํ•‘/ํ ๋‹ค์‹œ ์‹œ์ž‘

๊ทธ๋ž˜๋„ io.opts.query ๋Š” ์›ํ•  ๋•Œ๋งˆ๋‹ค ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋‚˜์˜ ์ธ์‹์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์œ ํšจํ•ฉ๋‹ˆ๋‹ค. :๋•€_๋ฏธ์†Œ:

๋‹ค์šด๊ทธ๋ ˆ์ด๋“œํ•ด๋„ ๊ดœ์ฐฎ๋‚˜์š”? 2.0.3์„ ์ผฐ์ง€๋งŒ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”, ์ €๋Š” ๊ฐ™์€ ์ข…๋ฅ˜์˜ ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ณ  ์žˆ์ง€๋งŒ ๋‘ ๊ฐ€์ง€ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. @omadoma ์†”๋ฃจ์…˜์„ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฌ๋“ ์ง€ ๋„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
OS - ์šฐ๋ถ„ํˆฌ 18.04
๋…ธ๋“œ - 12.16.2
npm - 6.14.5
socket.io - 2.3.0
๋‚ด ์ฝ”๋“œ -

์•ฑ.js

const speech = require('@google-cloud/speech');
const speechClient = new speech.SpeechClient(); // Creates a client
const environmentVars = require('dotenv').config();
const io = require('socket.io')();
const http = require('http');
const server = http.createServer();
io.attach(server, {
  pingTimeout: 60000,
});



console.log(io)



// =========================== SOCKET.IO ================================ //

io.on('connection', function (client) {
  console.log('Client Connected to server');
  let recognizeStream = null;

ejs ํŒŒ์ผ

<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.3.0/socket.io.js" integrity="sha256-bQmrZe4yPnQrLTY+1gYylfNMBuGfnT/HKsCGX+9Xuqo=" crossorigin="anonymous"></script>
<script src="/js/client.js"></script>

js ํŒŒ์ผ

const socket = io.connect("http://localhost:8080");

๋‚˜๋Š” socket.io ๋ฒ„์ „ 2.3.0์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ์— ์›น ์†Œ์ผ“ ์—ฐ๊ฒฐ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ํด๋ผ์ด์–ธํŠธ์˜ UI์— ๋ธŒ๋ผ์šฐ์ € ๊ฒฝ๊ณ (๋™๊ธฐ์‹)๊ฐ€ ์žˆ๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ 30์ดˆ(pingTimeout + pingInterval) ์ด์ƒ ๊ฒฝ๊ณ ๋ฅผ ๋‹ซ์ง€ ์•Š์œผ๋ฉด 'Websocket is already in CLOSING ๋˜๋Š” CLOSED state' ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜๊ณ  pingTimeout ์ด์œ ๊ฐ€ ์žˆ๋Š” ์—ฐ๊ฒฐ ํ•ด์ œ ์ด๋ฒคํŠธ. UI์— ๊ฒฝ๊ณ ๊ฐ€ ์žˆ์„ ๋•Œ ์ด ์›น ์†Œ์ผ“์˜ ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง€๋Š” ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. pingTimeout์„ 10๋ถ„์œผ๋กœ ๋Š˜๋ฆฌ๋ฉด 10๋ถ„ ๋™์•ˆ ์—ฐ๊ฒฐ ๋Š๊น€์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์œ„์˜ ์ฃผ์„์—์„œ ์ฝ์€ ๋‚ด์šฉ์—์„œ ์ด๊ฒƒ์€ ๋ถ€์ •์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(ํด๋ผ์ด์–ธํŠธ๋Š” 10๋ถ„๊นŒ์ง€ ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง„ ๊ฒƒ์„ ๋ชจ๋ฅผ ์ˆ˜ ์žˆ์Œ). ๊ทธ๋Ÿฌ๋‚˜ ๋„คํŠธ์›Œํฌ ์ค‘๋‹จ ๋“ฑ์ด ์žˆ์œผ๋ฉด ์ „์†ก ๋‹ซ๊ธฐ ์ด์œ ๋กœ ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง€๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด pingTimeout+pingInterval์„ ๋Š˜๋ ค๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๊นŒ? ์—ฐ๊ฒฐ ๋Š๊น€์ด ๊ฐ์ง€๋˜์ง€ ์•Š๋Š” ํŠน์ • ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์ด๊ฒƒ์„ ๊ณ ์น  ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰