์์ผ์ ์ฐ๊ฒฐ๋ ์ํ๋ก ๋๊ณ ๋ด ํ๋ก๊ทธ๋จ์์ ๋ค๋ฅธ ํ๋์ ํ์ง ์๋ ๋์ socket.io ๊ธฐ๊ณ ๋ด๋ถ(ํนํ backo2/index.js
๋ผ์ธ 83.1)์์ ๋ธ๋ผ์ฐ์ ์ฝ์์์ ๊ฐํ์ ์ผ๋ก(๊ทธ๋ฌ๋ ์๋นํ ์ผ๊ด๋๊ฒ) ์์ธ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ๋ด
๋๋ค. ํด๋น ์ค๋ฅ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
WebSocket is already in CLOSING or CLOSED state.
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 ์์ธ๋ ๊ธฐ๋ํ์ง ์์ต๋๋ค.
ํ์ฅ๋ ์คํ ์ถ์ :
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
์์ ํ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ณ ์ฝ๋๊ฐ ์ ํํฉ๋๋ค. ์ด๊ฒ์ ๋๋ฅผ ์ํด Chrome์์๋ง ๋ฐ์ํฉ๋๋ค. ๋ชจ์ง๋ผ๋ ๊นจ๋ํฉ๋๋ค. ํฌ๋กฌ์์ ์ด ์ค๋ฅ๋ ๊ณ์ํด์ ๋น๊ฐ ๋ด๋ฆฌ๊ณ ๋ด๊ฐ ๊ฐ์ง ๋ชจ๋ ์ฑํ
์ ๋ณต์ ํฉ๋๋ค. ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํด ๋ณด์์ต๋๋ค
socket.on('disconnect', () =>{
socket.disconnect();
});
์๋ฒ์์ ํด๋ผ์ด์ธํธ์ ์ฐ๊ฒฐ์ ๋์ง ์์ต๋๋ค. ํ์ํ ๊ฒฝ์ฐ ์ ์ฅ์ https://github.com/antoniab123456/Chat_app
์ฌ๊ธฐ์๋ ๊ฐ์ ๋ฌธ์
๋ธ๋ผ์ฐ์ ๊ฐ ์ ํด ์ํ์ธ ๊ฒฝ์ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
๋๋ ํฌ๋กฌ๊ณผ ๋งฅ 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๋นํธ)
๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋ํ ์๋ฒ์์ ํด๋ผ์ด์ธํธ๋ก ๋ณด๋ด๋ ๋ฉ์์ง๋ฅผ ๋ณต์ ํ๊ณ ์์ต๋๋ค.
๋งฅ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 ์ฐ๊ฒฐ์ด ๋์ด์ง ์ด์ ๋ชฉ๋ก์ด ์์ต๋๋ค.
๋ ๋ง์ ๋๋ฒ๊น
:
ํ ๊ฐ์ง ๊ด์ฐฐ์ ํด๋ผ์ด์ธํธ์ 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 ํ๋์ ์กฐ์ ํ๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค.
pingTimeout
& pingInterval
๊ฐ์ ๋ณ๊ฒฝํ๋ฉด์ ์ด 3๊ฐ์ง ๋ธ๋ผ์ฐ์ ๋ชจ๋์์ ๋ช ์๊ฐ ๋์ ํ
์คํธํ์ต๋๋ค. ๋ด๊ฐ ์ฐพ์ ํด๊ฒฐ์ฑ
:
pingTimeout
>= 30000
ms ์ค์ 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
๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ ๋๊น์ง ๊ด์ฌ์ด ์๋ ์ฌ๋์ด ์๋ ๊ฒฝ์ฐ ํด๋ผ์ด์ธํธ ์ธก์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ ์ ์์ต๋๋ค. ์ด๋ก ์ธํด ๋ธ๋ผ์ฐ์ ๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ๋ณดํ์ง ๋ชปํ๊ณ ๊ณผ๋ํ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
defaults write com.apple.Safari IncludeInternalDebugMenu 1
๋ช
๋ น์ ๋ถ์ฌ๋ฃ๊ณ ์คํํฉ๋๋ค.๋๊ตฌ๋ ์ง 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'
์ด๋ฒคํธ๊ฐ ์ ํ ๋ฐ์ํ์ง ์๋๋ค๋ ๊ฒ์ ๊นจ๋ฌ์์ต๋๋ค. ํ๋ฉด ์ ๊ธ์ ํด์ ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ผ๋ จ์ ์ด๋ฒคํธ๊ฐ ๋ํ๋ฉ๋๋ค.
๋ฐ๋ผ์ ํ ํฐ์ด ์ฌ์ ํ ๋น ๋ฌธ์์ด(์ฐ๊ฒฐ ์ ์ค์ ๋ ์ด๊ธฐ ๊ฐ)์ธ ์ด์ ๋ฅผ ์ค๋ช
ํ๋ '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: ๊ทธ๋์ ๋ด ๋ก๊น
์์ ๋ณผ ์ ์์์ต๋๋ค. ์, ์ฌ์ฐ๊ฒฐ ์๋๋ฆฌ์ค์ ์ด๋ฒคํธ ์์๋ ์ค์ ๋ก ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๊ทธ๋๋ 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์ ๋๋ ค๋ ๊ด์ฐฎ์ต๋๊น? ์ฐ๊ฒฐ ๋๊น์ด ๊ฐ์ง๋์ง ์๋ ํน์ ์๋๋ฆฌ์ค๊ฐ ์์ต๋๊น? ์๋๋ฉด ์ด๊ฒ์ ๊ณ ์น ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๊ธฐ๋ณธ pingTimeout์ด 60000(v2.0.4)์์ 5000(v2.1.0+)์ผ๋ก ๋ณ๊ฒฝ๋์ด Chrome๊ณผ ๊ฐ์ ์ผ๋ถ ๋ธ๋ผ์ฐ์ ์์๋ ์ถฉ๋ถํ์ง ์์ต๋๋ค.
์ต์ v2.2.0์ ํฌํจํ์ฌ v2.1.0+์์ ์ด ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์ฑ ์ ๋ค์๊ณผ ๊ฐ์ด ์๋ฒ์ ๊ธฐ๋ณธ pingTimeout์ ํฐ ๊ฐ์ผ๋ก ์ฌ์ ์ํ๋ ๊ฒ์ ๋๋ค.
๋๋