Socket.io: 재 μ—°κ²° ν›„ μ—¬λŸ¬ μ†ŒμΌ“μ΄ μ—΄λ¦½λ‹ˆλ‹€.

에 λ§Œλ“  2011λ…„ 07μ›” 28일  Β·  54μ½”λ©˜νŠΈ  Β·  좜처: socketio/socket.io

λ‚΄ socket.io μ‘μš© ν”„λ‘œκ·Έλž¨κ³Ό λ‹€λ₯Έ μ‚¬λžŒ λͺ¨λ‘μ—μ„œ 이것을 λ°œκ²¬ν–ˆμŠ΅λ‹ˆλ‹€. 재 연결이 λ°œμƒν•˜λ©΄ ν΄λΌμ΄μ–ΈνŠΈ λ‚΄μ—μ„œ 두 개 μ΄μƒμ˜ μ†ŒμΌ“μ΄ μ—΄λ¦¬λŠ” 것이 일반적이며 μ ˆλŒ€λ‘œ λ°œμƒν•΄μ„œλŠ” μ•ˆλ©λ‹ˆλ‹€.

λ‹€μŒμ€ 연결을 λŠκ±°λ‚˜ λ‹€μ‹œ μ—°κ²°ν–ˆμ„ λ•Œ 자체 ν…ŒμŠ€νŠΈ μ‘μš© ν”„λ‘œκ·Έλž¨μ—μ„œ 얻은 λ‘œκ·Έμž…λ‹ˆλ‹€.

** μ—°κ²° ν•΄μ œ* * μ§€μ—°μœΌλ‘œ 재 μ—°κ²° 1000 회 μ‹œλ„ : 1
** μ§€μ—°λœ 재 μ—°κ²° 2000 μ‹œλ„ : 2* * xhr-polling으둜 μ—°κ²°
** xhr-polling으둜 μ—°κ²°* * xhr-polling 전솑 μœ ν˜•μœΌλ‘œ 재 μ—°κ²° μ‹œλ„ : 2
** 연결됨* * 연결됨

이런 일이 λ°œμƒν•˜λ©΄ ν•˜λ‚˜λ§Œ μžˆμ–΄μ•Όν•˜μ§€λ§Œ μ—°κ²°λœ 각 μ†ŒμΌ“μ— λŒ€ν•΄ ν•˜λ‚˜μ”© 쀑볡 λ©”μ‹œμ§€κ°€ μ „μ†‘λ©λ‹ˆλ‹€. Firebug에 μ˜ν•΄ μ‹€μ œλ‘œ μ—°κ²°λœ ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ 두 개의 μ†ŒμΌ“μ΄ 있음이 ν™•μΈλ˜μ—ˆμŠ΅λ‹ˆλ‹€. λ‚΄ κ°€μž₯ 쒋은 좔츑은 이것이 ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œμ— μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. μ•„λ§ˆλ„ 첫 번째 재 μ—°κ²° μ‹œλ„λ₯Ό 닫지 μ•Šμ„ κ²ƒμž…λ‹ˆλ‹€.

λ¬Όλ‘  μ§„μ§œ μ§ˆλ¬Έμ€ μ• μ΄ˆμ— μ™œ λ‹¨μ ˆμ΄ μžˆμ—ˆμ„κΉŒμš”?

Socket.IO client bug

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

이것을 쑰금 더 쑰사 해보면 λ‚΄ 문제의 원인을 찾은 것 κ°™μŠ΅λ‹ˆλ‹€. 버그 λŠ” μ•„λ‹ˆμ§€λ§Œ ν΄λΌμ΄μ–ΈνŠΈ μΈ‘ μ½”λ“œμ˜ 잘λͺ»λœ κ΅¬ν˜„μž…λ‹ˆλ‹€. facepalm 이것은 λ‚΄κ°€ μ›λž˜ 가지고 있던 κ²ƒμž…λ‹ˆλ‹€ :

문제:

var socket = io.connect();

socket.on('connect', function () {

  console.log('User connected!');

  socket.on('message', function(message) {

    console.log(message);

  });

});

μœ„μ˜ ν΄λΌμ΄μ–ΈνŠΈ μΈ‘ JavaScriptλŠ” ν΄λΌμ΄μ–ΈνŠΈκ°€ λ‹€μ‹œ 연결될 λ•Œ console.log ()λ₯Ό μ—¬λŸ¬ 번 ν˜ΈμΆœν–ˆμŠ΅λ‹ˆλ‹€. 이것은 μœ„μ˜ λ‚΄μš©μ„ λ‹€μŒμœΌλ‘œ λŒ€μ²΄ ν•œ κ²ƒμž…λ‹ˆλ‹€.

ν•΄κ²°μ±…:

var socket = io.connect();

socket.on('connect', function () {

  console.log('User connected!');

});

socket.on('message', function(message) {

  console.log(message);

});

이제 ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„μ— λ‹€μ‹œ μ—°κ²°ν•  λ•Œ μ—¬λŸ¬ λ©”μ‹œμ§€κ°€ μ•žλ’€λ‘œ μ „μ†‘λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ‹€λ₯Έ μ‚¬λžŒμ΄ ν΄λΌμ΄μ–ΈνŠΈ μΈ‘ μ½”λ“œλ₯Ό λ³€κ²½ν•˜λ©΄ λ¬Έμ œκ°€ ν•΄κ²°λ˜λŠ”μ§€ 확인할 수 μžˆμŠ΅λ‹ˆκΉŒ?

λͺ¨λ“  54 λŒ“κΈ€

기술적으둜 ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„μ˜ 연결이 λŠμ–΄ 쑌기 λ•Œλ¬Έμ— μ—°κ²° ν•΄μ œκ°€ μ‹œμž‘λ©λ‹ˆλ‹€. 재 μ—°κ²° μ΄λ²€νŠΈκ°€ λ‹€μ‹œ λ°œμƒν•  λ•ŒκΉŒμ§€ 연결이 λŠμ–΄μ§‘λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ λ‚˜λ¨Έμ§€λŠ” λ²„κ·Έμž…λ‹ˆλ‹€.

이것이 λ‚΄ μ‘μš© ν”„λ‘œκ·Έλž¨μ˜ 버그에 λŒ€ν•œ 이유라고 μƒκ°ν•©λ‹ˆλ‹€.

μ„œλ²„ μΈ‘μ—μ„œλŠ” μƒˆλ‘œμš΄ μ‚½μž…λ¬Όμ΄μžˆμ„ λ•Œλ§ˆλ‹€ μ‹€ν–‰λ˜λ„λ‘ mongodb에 κΌ¬λ¦¬κ°€μžˆλŠ” μ»€μ„œλ₯Ό λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€. 이 λ©”μ‹œμ§€λŠ” io.sockets.emit ()λ₯Ό 톡해 μ—°κ²°λœ λͺ¨λ“  μ‚¬λžŒμ—κ²Œ μ „μ†‘λ©λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ 이벀트 λ‹Ή ν•˜λ‚˜μ˜ λ©”μ‹œμ§€ λ§Œλ°›λŠ” λŒ€μ‹  ν΄λΌμ΄μ–ΈνŠΈ μΈ‘μ—μ„œ μ—¬λŸ¬ 개의 반볡 λ©”μ‹œμ§€λ₯Όλ°›μŠ΅λ‹ˆλ‹€.

μ €λŠ” 인터넷 연결이 맀우 λΆˆμ•ˆμ •ν•˜κΈ° λ•Œλ¬Έμ—μ΄ 버그가 λ‚΄ μ½”λ“œμ—λ„ 영ν–₯을 미치고 μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

μ—¬λŸ¬λΆ„λ“€μ€ expressjsλ₯Ό μ‚¬μš©ν•˜κ³  계 μ…¨λ‚˜μš”? λ‚˜λŠ” Express 에이 λ¬Έμ œκ°€ μžˆμ—ˆκ³ μ—†μ΄ λ‹€μ‹œ μž‘μ„±ν–ˆμœΌλ©° 잘 μž‘λ™ν–ˆμŠ΅λ‹ˆλ‹€.

ExpressλŠ”μ΄ @mfkp 와 μ „ν˜€ 관련이 ν–ˆμŒ 에 ν‹€λ¦Ό μ—†μŠ΅λ‹ˆλ‹€.

@visionmedia 와 λ™μ˜ν•˜λ©° Expressκ°€ μ•„λ‹Œ socket.io의 λ²„κ·Έμž…λ‹ˆλ‹€. ν˜„μž¬ 재 μ—°κ²° κ΅¬ν˜„μ€ μ—¬μ „νžˆ ​​0.6 용으둜 섀계 λ˜μ—ˆκΈ° λ•Œλ¬Έμ— 일뢀 검사 및 정리가 λˆ„λ½λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

μ•„, μ•Œκ² μŠ΅λ‹ˆλ‹€. μ‹ κ²½ 쓰지 마, 계속해 ;-)

이것에 +1. socket.ioκ°€ μ—¬λŸ¬ 연결을 μ—¬λŠ” μ±„νŒ… μ•±μ˜ 간헐적 인 λ¬Έμ œμž…λ‹ˆλ‹€. 그런 λ‹€μŒ ν΄λΌμ΄μ–ΈνŠΈλŠ” λͺ¨λ“  방좜의 볡제λ₯Ό μˆ˜μ‹ ν•©λ‹ˆλ‹€.

+1. μ›Ή μ†ŒμΌ“ 및 크둬. λ…ΈνŠΈλΆμ΄ μ ˆμ „ λͺ¨λ“œλ‘œ μ „ν™˜-> κΉ¨μ–΄ λ‚œ ν›„ 앱이 λ‹€μ‹œ 연결됨-> 이쀑 이벀트. 원격 μ„œλ²„μ— μ—°κ²°ν•  λ•Œλ§Œ λ°œμƒν•©λ‹ˆλ‹€. 이 문제λ₯Ό λ‘œμ»¬μ—μ„œ μž¬ν˜„ ν•  수 μ—†μŠ΅λ‹ˆλ‹€. 일뢀 재 μ—°κ²° / λ„€νŠΈμ›Œν¬ λŒ€κΈ° μ‹œκ°„ 문제 μ—¬μ•Όν•©λ‹ˆλ‹€.

이 ν›„ μ—¬λŸ¬ 연결을 μ œκ±°ν•˜λŠ” ν•΄κ²° 방법이 μžˆμŠ΅λ‹ˆκΉŒ? 예λ₯Ό λ“€μ–΄ ν΄λΌμ΄μ–ΈνŠΈ μΈ‘μ—μ„œ socket.disconnect ()λ₯Ό μˆ˜ν–‰ν•˜λ©΄ λͺ¨λ“  연결이 λŠμ–΄ μ§‘λ‹ˆκΉŒ? μ—¬λŸ¬ μ—…λ°μ΄νŠΈλ₯Ό ν”Όν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€. λ‹€μŒμ€ μž‘λ™ν•©λ‹ˆκΉŒ?
μ†ŒμΌ“ = io.connect (url)
socket.on ( 'connect', function () {
if (multipleConnect) {
socket.disconnect ();
socket.removeAllListeners ( 'connect');
io.sockets = {};
μ†ŒμΌ“ = io.connect (url);
socket.on ( 'connect', functionToConnect);
}
})

https://github.com/LearnBoost/socket.io/issues/474#issuecomment -2833227을 μ½μœΌμ‹­μ‹œμ˜€.
이 버그가 λ°œμƒν•˜λŠ” μ΄μœ μ™€ μž¬ν˜„ 방법을 μ„€λͺ…ν•©λ‹ˆλ‹€.

@ 3rd-Eden-이 μˆ˜μ • 사항이 ν•  일 λͺ©λ‘ / μš°μ„  μˆœμœ„μ— μ†ν•˜λŠ”μ§€ μ•„μ‹­λ‹ˆκΉŒ? λ‚΄κ°€ λ§Œλ“€κ³ μžˆλŠ” 앱이 μžˆλŠ”λ° 이것을 μ‚¬μš©ν•˜λ €κ³  κ³„νšν–ˆκ³  ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ iOS μž₯μΉ˜μ—μ„œ μ œλŒ€λ‘œ λ‹€μ‹œ 연결될 것이라고 말할 수 있기λ₯Ό λ°”λžλ‹ˆλ‹€. μ‘μš© ν”„λ‘œκ·Έλž¨μ΄ λ°±κ·ΈλΌμš΄λ“œλ‘œ μ „ν™˜λ˜κ±°λ‚˜ μž₯μΉ˜κ°€ μ ˆμ „ λͺ¨λ“œλ‘œ μ „ν™˜λ˜λ©΄ 연결이 λŠμ–΄μ§‘λ‹ˆλ‹€.

λ˜λŠ” ν•΄κ²° 방법을 μ½”λ”© ν•  μˆ˜μžˆλŠ” 방법에 λŒ€ν•΄ μ•Œκ³  μžˆμŠ΅λ‹ˆκΉŒ? μ§€λ‚œ λ©°μΉ  λ™μ•ˆ λͺ‡ 가지 μž‘μ—…μ„ ν•΄μ™”μ§€λ§Œ μ΅œμƒμ˜ 경우 항상 λ„ˆλ¬΄ λ§Žμ€ 연결을 열어두고 λͺ¨λ“  μ†ŒμΌ“μ— μ €μž₯된 데이터λ₯Ό μ‚­μ œν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. λ°μ΄ν„°λŠ” ν΄λΌμ΄μ–ΈνŠΈμ˜ 재 μ—°κ²° 트리거λ₯Ό μ‚¬μš©ν•˜μ—¬ 문제λ₯Ό ν•΄κ²°ν•  μˆ˜μžˆλŠ” μ„Έμƒμ˜ 끝이 μ•„λ‹ˆμ§€λ§Œ λ™μ‹œ 연결은 μ•½κ°„ μΆ”ν•©λ‹ˆλ‹€.

감사!

@cris 이것이 당신이 μ–ΈκΈ‰ ν•œ 것과 λ™μΌν•œ 버그인지 ν™•μ‹€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ„œλ²„ 속도 μ €ν•˜μ—†μ΄ 버그에 λŒ€ν•œ 맀우 κ°„λ‹¨ν•œ μ˜ˆκ°€ μžˆμŠ΅λ‹ˆλ‹€.

λ‹€μŒμ„ 톡해이 문제λ₯Ό λͺ…ν™•ν•˜κ²Œ μž¬ν˜„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  1. 1 초 κ°„κ²©μœΌλ‘œ ν•˜νŠΈ λΉ„νŠΈλ₯Ό λ³΄λ‚΄λŠ” κ°„λ‹¨ν•œ ν•˜νŠΈ λΉ„νŠΈ ν΄λΌμ΄μ–ΈνŠΈλ₯Ό κ΅¬ν˜„ν•©λ‹ˆλ‹€.
  2. μ„œλ²„ μΈ‘ μƒˆ μ—°κ²° 수λ₯Ό κ³„μ‚°ν•©λ‹ˆλ‹€.
  3. μ„œλ²„ μΈ‘ μ—°κ²° ν•΄μ œ 수λ₯Ό κ³„μ‚°ν•©λ‹ˆλ‹€.
  4. μ„œλ²„λ₯Ό μ‹œμž‘ν•˜κ³  ν΄λΌμ΄μ–ΈνŠΈμ™€ μ—°κ²°ν•˜μ‹­μ‹œμ˜€.
  5. ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„ κ°„μ˜ λ„€νŠΈμ›Œν¬ 연결을 λŠμŠ΅λ‹ˆλ‹€.
  6. μ„œλ²„κ°€ μ‹œκ°„ 초과되고 μ—°κ²° ν•΄μ œ 이벀트λ₯Ό 생성 ν•  λ•ŒκΉŒμ§€ κΈ°λ‹€λ¦½λ‹ˆλ‹€.
  7. λ„€νŠΈμ›Œν¬ 연결을 λ‹€μ‹œ μ—°κ²°ν•˜μ‹­μ‹œμ˜€.

ν΄λΌμ΄μ–ΈνŠΈκ°€ λ‹€μ‹œ μ—°κ²°ν•  λ•Œ 각각에 λŒ€ν•΄ 'μ—°κ²°'이벀트λ₯Ό μƒμ„±ν•˜λŠ” 2-4 개의 연결을 μƒμ„±ν•˜λŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€. μ„œλ²„λŠ” ν΄λΌμ΄μ–ΈνŠΈλ‘œλΆ€ν„° 2-4 개의 연결을 μˆ˜μ‹ ν•˜κ³  각각에 λŒ€ν•΄ 'μ—°κ²°'이벀트λ₯Ό λ‚΄ λ³΄λƒ…λ‹ˆλ‹€. ν΄λΌμ΄μ–ΈνŠΈλŠ” 잘λͺ» μ‹œμž‘λœ 연결을 닫지 μ•ŠμŠ΅λ‹ˆλ‹€.

감사. 이 버그가 μš°μ„  μˆœμœ„κ°€λ˜μ–΄μ•Όν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. 잘 μ•Œμ§€ λͺ»ν•˜λŠ” λ§Žμ€ 상업 νšŒμ‚¬λ“€μ€ socket.io ν”„λ ˆμž„ μ›Œν¬κ°€ 잘 μž‘λ™ν•œλ‹€κ³  μƒκ°ν•˜λ©΄μ„œ μ‚¬λžŒλ“€μ„ κ³ μš©ν•˜μ—¬ κ°œλ°œν•˜λ €κ³ ν•©λ‹ˆλ‹€. λ¬Όλ‘  socket.ioλŠ” λ¬΄λ£Œμ΄λ―€λ‘œμ΄ 상업 νšŒμ‚¬λŠ” 상업 μ œν’ˆμ„ μ‚΄νŽ΄ 봐야 ν•  κ²ƒμž…λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ‹€μ‹œ λ§ν•˜μ§€λ§Œ, 이것은 맀우 높은 μš°μ„  μˆœμœ„λ‘œ μš°μ„  μˆœμœ„λ₯Ό μ •ν•΄μ•Όν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. 이 λ²„κ·ΈλŠ” 0.7.0 이후 μ‘΄μž¬ν–ˆμœΌλ©° μ‰½κ²Œ μž¬ν˜„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

@davidfooks , @theyak. λ‚˜λŠ” 였래 전에이 문제λ₯Ό ν•΄κ²°ν–ˆμœΌλ©° μ†Œλž€μ—†μ΄ μž‘λ™ν•©λ‹ˆλ‹€.

μˆ˜μ •ν•˜λ €λ©΄ λ‹€μŒμ„ μˆ˜ν–‰ν•΄μ•Όν•©λ‹ˆλ‹€.

  1. 이 패치 적용 : https://github.com/LearnBoost/socket.io-client/pull/342
  2. pull-request 주석에 μ„€λͺ… λœλŒ€λ‘œ AJAX- ν•Έλ“œ 셰이크λ₯Ό λΉ„ν™œμ„±ν™”ν•©λ‹ˆλ‹€ (ν•Έλ“œ 셰이크가 JSONPλ₯Ό ν†΅ν•΄μ„œλ§Œ κ°€λŠ₯ν•˜λ„λ‘ 함).

AJAX ν•Έλ“œ 셰이크λ₯Ό μ–΄λ–»κ²Œ λΉ„ν™œμ„±ν™”ν•©λ‹ˆκΉŒ? μ—¬μ „νžˆ λͺ¨λ“  μ—°κ²° μœ ν˜•μ„ μ‚¬μš©ν•  수 μžˆλ‹€κ³  κ°€μ •ν•©λ‹ˆλ‹€. 이것이 ν•Έλ“œ μ…°μ΄ν¬μ—λ§Œ 영ν–₯을 λ―ΈμΉ©λ‹ˆ 까?

+1 μˆ˜μ • ν•΄μ£Όμ„Έμš” :)

λ‹€μ‹œ μ—°κ²° λ¬Έμ œμ— λŒ€ν•΄ λ™μΌν•œ 닀쀑 연결이 λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. μ‹¬κ°ν•œ 문제라고 μƒκ°ν•©λ‹ˆλ‹€ ...
원인은 Socket.connect λ©”μ„œλ“œκ°€ ν˜ΈμΆœλ˜μ—ˆμ§€λ§Œ conneting ν”Œλž˜κ·ΈλŠ” ν•Έλ“œ 셰이크가 μ™„λ£Œλœ 후에 만 ​​true둜 μ„€μ •λ˜μ–΄ 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€. λ‹€μ‹œ μ—°κ²°ν•˜λ©΄ μ—¬λŸ¬ 번 λ‹€μ‹œ μ—°κ²°λ©λ‹ˆλ‹€.
Socket.connect λ©”μ„œλ“œμ˜ μ‹œμž‘ λΆ€λΆ„μ—μ„œ self.reconnecting을 ν˜ΈμΆœν•˜μ—¬ 문제λ₯Ό ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€.

병합 ν•  κ°€λŠ₯성이 μžˆμŠ΅λ‹ˆκΉŒ?
이 λ²„κ·ΈλŠ” λ‚΄ μ•±μ—μ„œλ„ λ‚˜μœ 버그λ₯Ό λ§Œλ“€κ³  μžˆμŠ΅λ‹ˆλ‹€.

이 λ²„κ·ΈλŠ” μ—¬μ „νžˆ μ‘΄μž¬ν•©λ‹ˆλ‹€. 두 패치λ₯Ό λͺ¨λ‘ μ‹œλ„ν–ˆμŠ΅λ‹ˆλ‹€. μ„±κ³΅ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.

+1 xhr-polling을 μ‚¬μš©ν•˜μ—¬μ΄ λ¬Έμ œκ°€ 많이 λ°œμƒν•©λ‹ˆλ‹€. 아직 패치λ₯Ό μ‹œλ„ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

+1, 쀑볡 재 연결에 λŒ€ν•΄μ„œλ„μ΄ λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€.

Node.jsκ°€ λ‹€μ‹œ μ‹œμž‘λ  λ•Œλ§ˆλ‹€ (즉, μˆ˜νΌλ°”μ΄μ €λ₯Ό 톡해 싀행될 λ•Œ) ν΄λΌμ΄μ–ΈνŠΈκ°€ 처음 μ—°κ²°λ˜μ—ˆλ˜ μ§€μ μ—μ„œ Node.jsκ°€ λ‹€μ‹œ μ‹œμž‘λœ 횟수의 X λ°°κ°€ λ‹€μ‹œ μ—°κ²°λ©λ‹ˆλ‹€. 이 λ²„κ·Έλ‘œ 인해 ν΄λΌμ΄μ–ΈνŠΈ μΈ‘μ—μ„œ 재 μ—°κ²°ν•  λ•Œλ§ˆλ‹€ ν•œ λ²ˆμ”© μ΄λ²€νŠΈκ°€ λ°œμƒν•©λ‹ˆλ‹€. 이것은 단지 쀑볡 λ¬Έμ œκ°€ μ•„λ‹™λ‹ˆλ‹€.

ν΄λΌμ΄μ–ΈνŠΈ μΈ‘μ—μ„œ socket.on('disconnect', function() { socket.disconnect(); }); μ‹œλ„ν–ˆμ§€λ§Œ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. : /

이것을 쑰금 더 쑰사 해보면 λ‚΄ 문제의 원인을 찾은 것 κ°™μŠ΅λ‹ˆλ‹€. 버그 λŠ” μ•„λ‹ˆμ§€λ§Œ ν΄λΌμ΄μ–ΈνŠΈ μΈ‘ μ½”λ“œμ˜ 잘λͺ»λœ κ΅¬ν˜„μž…λ‹ˆλ‹€. facepalm 이것은 λ‚΄κ°€ μ›λž˜ 가지고 있던 κ²ƒμž…λ‹ˆλ‹€ :

문제:

var socket = io.connect();

socket.on('connect', function () {

  console.log('User connected!');

  socket.on('message', function(message) {

    console.log(message);

  });

});

μœ„μ˜ ν΄λΌμ΄μ–ΈνŠΈ μΈ‘ JavaScriptλŠ” ν΄λΌμ΄μ–ΈνŠΈκ°€ λ‹€μ‹œ 연결될 λ•Œ console.log ()λ₯Ό μ—¬λŸ¬ 번 ν˜ΈμΆœν–ˆμŠ΅λ‹ˆλ‹€. 이것은 μœ„μ˜ λ‚΄μš©μ„ λ‹€μŒμœΌλ‘œ λŒ€μ²΄ ν•œ κ²ƒμž…λ‹ˆλ‹€.

ν•΄κ²°μ±…:

var socket = io.connect();

socket.on('connect', function () {

  console.log('User connected!');

});

socket.on('message', function(message) {

  console.log(message);

});

이제 ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„μ— λ‹€μ‹œ μ—°κ²°ν•  λ•Œ μ—¬λŸ¬ λ©”μ‹œμ§€κ°€ μ•žλ’€λ‘œ μ „μ†‘λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ‹€λ₯Έ μ‚¬λžŒμ΄ ν΄λΌμ΄μ–ΈνŠΈ μΈ‘ μ½”λ“œλ₯Ό λ³€κ²½ν•˜λ©΄ λ¬Έμ œκ°€ ν•΄κ²°λ˜λŠ”μ§€ 확인할 수 μžˆμŠ΅λ‹ˆκΉŒ?

μ•ˆλ…•ν•˜μ„Έμš”. λ‚˜λŠ” 같은 λ¬Έμ œκ°€ μžˆμ—ˆλ‹€. λ…Έλ“œλ₯Ό λ‹€μ‹œ μ‹œμž‘ν•  λ•Œ (λ˜λŠ” μ—°κ²° μ‹œκ°„μ΄ μ΄ˆκ³Όλ˜μ—ˆμ„ λ•Œ) ν΄λΌμ΄μ–ΈνŠΈκ°€ λ‹€μ‹œ μ—°κ²°λ˜μ—ˆμ„ λ•Œ n 번 μ„œλ²„μ—μ„œ 방좜 된 λ™μΌν•œ λ©”μ‹œμ§€λ₯Ό μˆ˜μ‹ ν–ˆμŠ΅λ‹ˆλ‹€ (μ—¬κΈ°μ„œ n은 재 μ—°κ²° 횟수).
λ‚΄ λͺ¨λ“  ν•Έλ“€λŸ¬λ₯Ό socket.on ( 'connect'function () {...}); κ·Έκ²ƒμ˜ 외뢀에 κΈ°λŠ₯.

μœ„μ˜ μ½”λ“œλŠ” ν•„μš”ν•œ μž‘μ—…μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.
이것은 메일 링리슀트의 전체 λ‹΅λ³€μž…λ‹ˆλ‹€.
https://groups.google.com/forum/?hl=ko&fromgroups#!topic/socket_io/X9FRMjCkPco

@xdanx , ꡉμž₯ν•©λ‹ˆλ‹€. λ‹΅μž₯을

예, 이것은 μ €μ—κ²Œλ„ μž‘λ™ν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€ : 'connect'이벀트 μ½”λ“œμ™€ λ³„λ„λ‘œ socket.on ( 'message') μ½”λ“œλ₯Ό λ„£μœΌμ‹­μ‹œμ˜€.

ν•˜μ§€λ§Œ "μ—°κ²°"은 μ–΄λ–»μŠ΅λ‹ˆκΉŒ?
그리고 콜백의 "μ†ŒμΌ“"κ°μ²΄λŠ” μ–΄λ–»μŠ΅λ‹ˆκΉŒ?

/ edit μ‹ κ²½ 쓰지 λ§ˆμ„Έμš”. ν΄λΌμ΄μ–ΈνŠΈμ— 'μ—°κ²°'이 μžˆμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” κ·Έκ²ƒμ„ν•˜μ§€ μ•Šμ•˜μ„ λ•Œ 슀팸 재 연결에 μ—¬μ „νžˆ λ¬Έμ œκ°€ μžˆμ—ˆλ‹€. ν•˜μ§€λ§Œ 그건 0.9.6μ΄μ—ˆμŠ΅λ‹ˆλ‹€.

저도 같은 λ¬Έμ œκ°€μžˆλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. λ©”μ‹œμ§€ μ½”λ“œλ₯Ό λ³„λ„μ˜ λΈ”λ‘μœΌλ‘œ μ΄λ™ν•˜λŠ” μœ„μ˜ μˆ˜μ •μ„ μ‹œλ„ν–ˆμ§€λ§Œ .. ν•¨κ»˜ 가지고 μžˆμ§€ μ•Šλ‹€λŠ” 것을 μ•Œμ•˜μŠ΅λ‹ˆλ‹€.

0.9.8μ—μ„œ 이에 λŒ€ν•œ λ‹€λ₯Έ ν•΄κ²° 방법에 λŒ€ν•œ μ†Œμ‹μ΄ μžˆμŠ΅λ‹ˆκΉŒ?

λ‚˜λŠ” 같은 문제λ₯Ό κ°€μ§€κ³ μžˆλ‹€. 0.9.10이 μ„€μΉ˜λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. 이 문제λ₯Ό ν•΄κ²°ν•  방법이 μžˆμŠ΅λ‹ˆκΉŒ? :(
btwλŠ” 1 년이 λ„˜μ—ˆκ³  아직 μˆ˜μ •λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€ .. :(

νŽΈμ§‘ν•˜λ‹€.

jsonp-polling 만 μ‚¬μš©ν•˜λ©΄ λ¬Έμ œκ°€ 사라진 것 κ°™μŠ΅λ‹ˆλ‹€.
io.set ( 'transports', [ 'jsonp-polling']);

λ‚˜λŠ” 같은 문제λ₯Ό κ°€μ§€κ³ μžˆλ‹€.
μ†ŒμΌ“. [email protected]
λ…Έλ“œ v0.8.8

@semprom jsonp-polling을 μ‚¬μš©ν•˜λ©΄ websocket μ—°κ²°μ—λ§Œ 관련이 있기 λ•Œλ¬Έμ— λ¬Έμ œκ°€ ν•΄κ²°λœλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

λΆˆν–‰νžˆλ„ μ €μ˜ 전체 κ΅¬ν˜„ μœ ν˜•μ€ κ°€λŠ₯ν•œ ν•œ λΉ λ₯Έ ν”Όλ“œλ°±μ— μ˜μ‘΄ν•˜λ―€λ‘œ 폴링과 달리 μ›Ή μ†ŒμΌ“μ΄ κ°€μž₯ 잘 μž‘λ™ν•˜λ©° μ—°κ²°ν•˜λŠ” ν΄λΌμ΄μ–ΈνŠΈλ₯Ό μ œμ–΄ν•˜κ³  있기 λ•Œλ¬Έμ—μ΄ 문제λ₯Ό μ œμ™Έν•˜κ³ λŠ” λ‹€λ₯Έ μ΄μœ κ°€ μ—†μŠ΅λ‹ˆλ‹€. 그밖에.

λ‹€μ‹œ μ—°κ²°ν•˜λŠ” λ™μΌν•œ ν΄λΌμ΄μ–ΈνŠΈμ˜ μ—¬λŸ¬ μ—°κ²°μ—λŠ” λ™μΌν•œ socket.id μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œμ΄ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μžμ‹ μ˜ μ†ŒμΌ“ ID λͺ©λ‘μ„ μœ μ§€ν•˜κ³  쀑볡을 λ¬΄μ‹œν•  수 μžˆμŠ΅λ‹ˆλ‹€.

@KasperTidemann κ°μ‚¬ν•©λ‹ˆλ‹€. 이 문제λ₯Ό ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€.

@esanai 문제 μ—†μŠ΅λ‹ˆλ‹€.

μ•ˆλ…•ν•˜μ„Έμš”, λ™μΌν•œ λ¬Έμ œκ°€ 있으며 연결이 λ‹€μ‹œ 연결될 λ•Œλ§ˆλ‹€ μƒˆ ν΄λΌμ΄μ–ΈνŠΈ μ†ŒμΌ“ IDκ°€ μƒμ„±λœλ‹€λŠ” 것을 μ•Œμ•˜μŠ΅λ‹ˆλ‹€. 해결책은 io.set ( 'transports', [ 'jsonp-polling']); λ˜λŠ” KasperTidemann의 μ†”λ£¨μ…˜μ„ μ‚¬μš©ν•©λ‹ˆκΉŒ?

@KasperTidemann λ‚΄ λ§™μ†Œμ‚¬, 그게 λ‚΄ λ¬Έμ œμ— λŒ€ν•œ λ‹΅μž…λ‹ˆλ‹€! 이 컀밋을 μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€ : https://github.com/samuelclay/NewsBlur/commit/76cbbd8d8b2a787985bba724dc3562108492b017#L2L3887

단일 node.js νŒŒμΌμ—μžˆλŠ”μ΄ κ°„λ‹¨ν•œ ν΄λΌμ΄μ–ΈνŠΈ 및 μ„œλ²„ μ½”λ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ—°κ²° 였λ₯˜κ°€ λ°œμƒν•œ ν›„ 이쀑 μ—°κ²° 이벀트λ₯Ό μž¬ν˜„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

"use strict";

var server = require('socket.io');
var client = require('socket.io-client');

setTimeout(function () {
    var io = server.listen(8888);

    io.of('/chat').on('connection', function (socket) {
        console.log('Server: /chat connection');
        socket.emit('greeting', 'Hello, who are you?');
    });

    io.sockets.on('connection', function (socket) {
        console.log('Server: connection');
    });
}, 2000);

var socketAddress = 'http://localhost:8888/chat';
var socket = client.connect(socketAddress);

socket.on('connect', function () {
    console.log("Client: connect");
});

socket.on('greeting', function (data) {
    console.log("Client: greeting: ", data);
});

socket.on('error', function () {
    console.log("Client: error");
    socket.socket.reconnect();
});

λΌμš΄λ“œ λ‚˜ μˆ˜μ • μž‘μ—…μ΄ μžˆμŠ΅λ‹ˆκΉŒ?

λ―Έμ•ˆν•˜μ§€λ§Œ λ‚˜λŠ” 이것을 # 474 ν˜Έμ— κ²Œμ‹œν–ˆμŠ΅λ‹ˆλ‹€.

iOS 9.3.2 및 Chrome 버전 50.0.2661.95κ°€ μ„€μΉ˜λœ iPhoneκ³Ό Socket.IO 버전 1.4.6이 μ„€μΉ˜λœ iOS 용 Safariμ—μ„œμ΄ 였λ₯˜λ₯Ό μƒλ‹Ήνžˆ μΌκ΄€λ˜κ²Œ μž¬ν˜„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” 이것을 λͺ¨λ°”μΌμ—μ„œλ§Œ μž¬ν˜„ ν•  수 있으며 socket.io에 λŒ€ν•œ μš”μ²­μ— λ‚΄ νŽ˜μ΄μ§€λ₯Ό 멈 μΆ₯λ‹ˆ λ‹€.

λ‚˜λŠ” κ°„λ‹¨ν•œ .on ( 'connect', function (socket) {console.log ( 'Connected');}); 그리고 였λ₯˜κ°€ λ°œμƒν•˜λ©΄ Connectedλ₯Ό 두 번 κΈ°λ‘ν•˜μ—¬ λ™μ‹œμ— μ—¬λŸ¬ μ†ŒμΌ“ 연결을 μ—΄λ €κ³  μƒκ°ν•˜κ²Œ λ§Œλ“­λ‹ˆλ‹€.

screenshot 2016-05-27 13 03 44

λˆ„κ΅¬λ“ μ§€ 이것에 λŒ€ν•œ ν•΄κ²° 방법을 μ•Œκ³  μžˆμŠ΅λ‹ˆκΉŒ?

이 λ¬Έμ œκ°€ μ’…κ²° 된 μ΄μœ λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ?

μœ„μ˜ 2014 λ…„ 4 μ›” 14 일의 예제 μ½”λ“œλŠ” 더 이상 이쀑 μ—°κ²° 이벀트λ₯Ό μƒμ„±ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. '/ chat'에 λŒ€ν•œ μ—°κ²° μ΄λ²€νŠΈμ™€ μ†ŒμΌ“ μžμ²΄μ— λŒ€ν•œ μ—°κ²° μ΄λ²€νŠΈκ°€ μžˆμŠ΅λ‹ˆλ‹€. ν•©λ¦¬μ μœΌλ‘œ λ³΄μž…λ‹ˆλ‹€.

더 이상 ν΄λΌμ΄μ–ΈνŠΈμ—μ„œλ„ 였λ₯˜κ°€ μ—†μŠ΅λ‹ˆλ‹€.

socket.io 1.4.8 및 λ…Έλ“œ 6.3.0μž…λ‹ˆλ‹€.

이 λ²„κ·ΈλŠ” atm에 영ν–₯μ„μ€λ‹ˆλ‹€.

λΆ„λͺ…νžˆ socket_handlersκ°€ κ²½λ‘œμ™€ ν•¨κ»˜ 배치되면 μ—¬λŸ¬ 번 ν˜ΈμΆœλ©λ‹ˆλ‹€. app.js λ‚΄μ—μ„œ μ†ŒμΌ“ 연결을 μ‚¬μš©ν•˜κ³  μ†ŒμΌ“ μ—°κ²° λ‚΄μ—μ„œ ν•Έλ“€λŸ¬λ₯Ό μš”κ΅¬ν•˜κ³  μ†ŒμΌ“μ„ 맀개 λ³€μˆ˜λ‘œ μ „λ‹¬ν•©λ‹ˆλ‹€. 일뢀 속성은 μ†ŒμΌ“ μΈμŠ€ν„΄μŠ€μ™€ ν•¨κ»˜ μ œκ³΅λ˜μ§€ μ•Šμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

@leemlwando ν•„μš”ν•œ 경우 μƒˆ 문제λ₯Όμ—¬μ‹­μ‹œμ˜€.

ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ μˆ˜λ™ 재 μ—°κ²° κΈ°λŠ₯을 λ§Œλ“€κ³  io.destroy (); λ‹€μ‹œ μ—°κ²° κΈ°λŠ₯ λ‚΄μ—μ„œ λ¬Έμ œκ°€ ν•΄κ²°λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

κ³ λ§ˆμ›Œμš” @leemlwando κ·€ν•˜μ˜ λ§ˆμ§€λ§‰ μ½”λ©˜νŠΈκ°€ 제 문제λ₯Ό ν•΄κ²°ν•˜λ„λ‘ λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€.

이 버그가 계속 λ°œμƒν•©λ‹ˆλ‹€. μ—…λ°μ΄νŠΈκ°€ μžˆμŠ΅λ‹ˆκΉŒ?

μ—¬κΈ°μ„œ μœ μΌν•œ μ§„μ§œ λ²„κ·ΈλŠ” socket.on () 호좜이 socket.on ( 'connect') ν•Έλ“€λŸ¬ 내뢀에 λž˜ν•‘λ˜λŠ” 잘λͺ»λœ 예제 μ½”λ“œκ°€ 인터넷에 가득 μ°¨ μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. μ†ŒμΌ“μ΄ λ‹€μ‹œ 연결될 λ•Œλ§ˆλ‹€ 처리기의 μƒˆ μΈμŠ€ν„΄μŠ€κ°€ κΈ°μ‘΄ μΈμŠ€ν„΄μŠ€ μœ„μ— μŒ“μ—¬μ„œ 각 μ΄λ²€νŠΈμ— λŒ€ν•΄ μ—¬λŸ¬ 호좜이 λ°œμƒν•©λ‹ˆλ‹€. ν•˜μ§€ λ§ˆμ‹­μ‹œμ˜€ : 2012 λ…„ 7 μ›” 25 일의 @KasperTidemann 의 닡변을 μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€.

μœ„μ—μ„œ μ œμ‹œ ν•œ μ½”λ“œλ₯Ό μ œμ™Έν•˜κ³ λŠ” μ•„λ§ˆλ„ DrLexOκ°€ 문제λ₯Ό λ³΄μ—¬μ£Όμ—ˆμŠ΅λ‹ˆλ‹€. socket.on ( 'connect') ν•Έλ“€λŸ¬ μ•ˆμ—λŠ” socket.on ()이 λž˜ν•‘λ˜μ–΄ μžˆμ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λͺ‡ 년이 μ§€λ‚œ 후에도이 버그에 λŒ€ν•œ μ•Œλ¦Όμ„ λ°›κ³  μžˆλ‹€λŠ” 사싀에 λ†€λžμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” 그것이 μ—¬μ „νžˆ 일인지 μ•„λ‹Œμ§€ μ „ν˜€ λͺ¨λ₯Έλ‹€. λ‹€μ‹œ μ‹œλ„ν•΄μ•Όν•©λ‹ˆκΉŒ?

@KasperTidemann κ°μ‚¬ν•©λ‹ˆλ‹€. μ‹€μ œλ‘œ 문제λ₯Ό ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€.

socket μ•‘μ„ΈμŠ€ ν•  μˆ˜μ—†λŠ” 경우 connect λ¦¬μŠ€λ„ˆμ˜ _outside_ 이벀트 λ¦¬μŠ€λ„ˆλ₯Ό μ–΄λ–»κ²Œ μ •μ˜ ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?

const app = express();
const http = require('http').createServer(app);
const io = require('socket.io')(http);

io.on('connect', function(socket) {

  // only now that we are inside the connect callback do we have access to the socket

  socket.on('join', function(room, user) {
  });

  socket.on('add_message', function(room, user) {
  });

  socket.on('disconnect', function(room, user) {
  });
});

μ‚¬λžŒλ“€μ€ 이벀트 λ¦¬μŠ€λ„ˆ ( join , add_message 및 disconnect )κ°€ λ…λ¦½μ μœΌλ‘œ, _outside_ connect λ¦¬μŠ€λ„ˆκ°€ μžˆμ–΄μ•Όν•œλ‹€κ³  μ œμ•ˆν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. socket μ •μ˜ μ€‘μž…λ‹ˆκΉŒ?

io.on('connect', function(socket) {
  // socket is only available here
});

// socket is undefined here

socket.on('join', function(room, user) {
});

socket.on('add_message', function(room, user) {
});

socket.on('disconnect', function(room, user) {
});

이것이 κ°€λŠ₯ν•˜λ„λ‘ socket λ₯Ό μΈμŠ€ν„΄μŠ€ν™”ν•˜λŠ” λ‹€λ₯Έ 방법이 μžˆμŠ΅λ‹ˆκΉŒ?

μ™œ 이것이 λ‹«ν˜€ μžˆμŠ΅λ‹ˆκΉŒ? @ michael-lynch에 μœ νš¨ν•œ ν¬μΈνŠΈκ°€ μžˆμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” λ˜ν•œ @ michael-lynch의 μš”μ μ— λŒ€ν•œ 닡을 μ•Œκ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

socket.io μ›Ή μ‚¬μ΄νŠΈ 예제의 @ DrLex0 은 λ‹€μŒμ„ μˆ˜ν–‰ν•˜λŠ” 것을 λ³΄μ—¬μ€λ‹ˆλ‹€.

io.on('connection', function(socket){
  socket.on('chat message', function(msg){
    io.emit('chat message', msg);
  });
});
이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰