Socket.io-client: ๋””๋ฒ„๊ฑฐ๊ฐ€ ์žˆ์„ ๋•Œ XHR ํด๋ง ์˜ค๋ฅ˜๊ฐ€ ๋‚˜ํƒ€๋‚จ

์— ๋งŒ๋“  2017๋…„ 04์›” 13์ผ  ยท  30์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: socketio/socket.io-client

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

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

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

react-native์—์„œ ์›น ์†Œ์ผ“ ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ”Œ๋žซํผ์ด ์ง€์›๋˜๋Š”์ง€ ์—ฌ๋ถ€๋Š” ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ์ด ์˜ค๋ฅ˜๋Š” ์ผ๋ฐ˜ node.js ์•ฑ์—์„œ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ƒํ•˜๊ฒŒ๋„ react-native์˜ ๋‚ด์žฅ ๋””๋ฒ„๊ฑฐ๊ฐ€ ๋น„ํ™œ์„ฑํ™” ๋œ ๊ฒฝ์šฐ์—๋งŒ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. react-native v0.43.1 ๋ฐ socket.io-client v1.7.3 ํ•˜์—ฌ IOS 10.2์—์„œ ์ด๊ฒƒ์„ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์„œ๋ฒ„๋Š” HTTP ํฌํŠธ 1337์—์„œ ํ˜ธ์ŠคํŒ…๋˜๋Š” socket.io v1.7.2 ์‹คํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค.

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

react-native์—์„œ socket.io-client ๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ๋””๋ฒ„๊ฑฐ๋ฅผ ํ™œ์„ฑํ™” ํ•˜์ง€ ์•Š๊ณ  ์—ฐ๊ฒฐ XHR: POLLING ERROR ๋ฉ๋‹ˆ๋‹ค. ๋‚ด ์ „์†ก ์˜ต์…˜์—์„œ 'websocket'์„ ์ง€์ •ํ•˜๋ฉด ์˜ค๋ฅ˜๋Š” WEBSOCKET ERROR ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ๋‚ด๊ฐ€ ์–ป๋Š” ์ „๋ถ€์•ผ.

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

๋‚ด ์„œ๋ฒ„์— ๋Œ€ํ•œ ์ผ๋ฐ˜ ์›น ์†Œ์ผ“ ์—ฐ๊ฒฐ. ๋””๋ฒ„๊ฑฐ๊ฐ€ ํ™œ์„ฑํ™”๋œ ์ƒํƒœ์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์„ค์ •

  • OS: OSX ์—˜ ์บํ”ผํƒ„ 10.11.6
  • ๋ธŒ๋ผ์šฐ์ €: react-native๊ฐ€ ์›นํ‚ท์„ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • socket.io ๋ฒ„์ „: ์œ„์— ์–ธ๊ธ‰๋จ

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

์ด ๋ฌธ์ œ์™€ ๊ด€๋ จํ•˜์—ฌ ๋‚ด๊ฐ€ ์ฐพ์€ ์œ ์ผํ•œ ๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” #1056์ด์—ˆ๊ณ  ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๊ฐ€ ์–ผ๋งˆ๋‚˜ ์ด์ƒํ•˜๊ฒŒ ๊ด€๋ จ๋˜์–ด ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด ๋†€๋ž์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜ node.js ์•ฑ์—์„œ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๋‹ค์‹œ ์‹œ๋„ํ–ˆ๊ณ  ๋น„์Šทํ•œ ๊ฒฐ๊ณผ๋ฅผ ๊ฒฝํ—˜ํ–ˆ์ง€๋งŒ ์˜ค๋ฅ˜๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ๋” ์ž์„ธํžˆ ์„ค๋ช…๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ง€์ •๋œ ์ „์†ก ์˜ต์…˜ ์—†์ด:

{ Error: xhr poll error
    at XHR.Transport.onError (/path/to/root/node_modules/engine.io-client/lib/transport.js:64:13)
    at Request.<anonymous> (/path/to/root/node_modules/engine.io-client/lib/transports/polling-xhr.js:129:10)
    at Request.Emitter.emit (/path/to/root/node_modules/component-emitter/index.js:133:20)
    at Request.onError (/path/to/root/node_modules/engine.io-client/lib/transports/polling-xhr.js:307:8)
    at Timeout._onTimeout (/path/to/root/node_modules/engine.io-client/lib/transports/polling-xhr.js:254:18)
    at ontimeout (timers.js:365:14)
    at tryOnTimeout (timers.js:237:5)
    at Timer.listOnTimeout (timers.js:207:5) type: 'TransportError', description: 503 }

transports: ['websocket'] :

{ Error: websocket error
    at WS.Transport.onError (/path/to/root/node_modules/engine.io-client/lib/transport.js:64:13)
    at WebSocket.ws.onerror (/path/to/root/node_modules/engine.io-client/lib/transports/websocket.js:149:10)
    at WebSocket.onError (/path/to/root/node_modules/ws/lib/WebSocket.js:452:14)
    at emitOne (events.js:96:13)
    at WebSocket.emit (events.js:189:7)
    at ClientRequest.onerror (/path/to/root/node_modules/ws/lib/WebSocket.js:711:10)
    at emitOne (events.js:96:13)
    at ClientRequest.emit (events.js:189:7)
    at TLSSocket.socketErrorListener (_http_client.js:358:9)
    at emitOne (events.js:96:13)
  type: 'TransportError',
  description: 
   { Error: socket hang up
       at TLSSocket.onHangUp (_tls_wrap.js:1117:19)
       at Object.onceWrapper (events.js:291:19)
       at emitNone (events.js:91:20)
       at TLSSocket.emit (events.js:186:7)
       at endReadableNT (_stream_readable.js:974:12)
       at _combinedTickCallback (internal/process/next_tick.js:74:11)
       at process._tickCallback (internal/process/next_tick.js:98:9)
     code: 'ECONNRESET',
     type: 'error',
     target: 
      WebSocket {
        domain: null,
        _events: [Object],
        _eventsCount: 4,
        _maxListeners: undefined,
        _socket: null,
        _ultron: null,
        _closeReceived: false,
        bytesReceived: 0,
        readyState: 0,
        supports: [Object],
        extensions: {},
        _binaryType: 'nodebuffer',
        _isServer: false,
        url: 'wss://SERVER_IP:1337/socket.io/?EIO=3&transport=websocket',
        protocolVersion: 13 } } }

๋˜ํ•œ socket.io์˜ ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ฐ˜ ํด๋ผ์ด์–ธํŠธ๋Š” ์ด ํŠน์ • ์›น ์„œ๋ฒ„์— ์™„๋ฒฝํ•˜๊ฒŒ ์—ฐ๊ฒฐํ•˜์—ฌ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์–‘ํ•œ ๋„คํŠธ์›Œํฌ, ISP ๋ฐ VPN์„ ์‚ฌ์šฉํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ด ์‹œ์ ์—์„œ ๋‚˜๋Š” ๋‹จ์„œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

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

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

ํด๋ผ์ด์–ธํŠธ์—์„œ opts.transports ๋ฅผ websocket ๋กœ๋งŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

io.connect(url, { transports: ['websocket'] }); // default is ['polling', 'websocket']

์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•˜๊ธฐ ์ „์— ๋„ˆ๋ฌด ๋ณต์žกํ•œ ์†Œ์ผ“ ๋ฐ ์ž‘์—… ๋ฐ”์ธ๋”ฉ ๋…ผ๋ฆฌ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ฝ”๋“œ์˜ ์†Œ์ผ“ ๋…ผ๋ฆฌ๊ฐ€ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ๋””๋ฒ„๊ทธ๋ฅผ ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“œ์‹ญ์‹œ์˜ค.

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

์—…๋ฐ์ดํŠธ : ๋งˆ์ง€๋ง‰์œผ๋กœ socket.io-client๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ iPhone์—์„œ ๋‚ด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์ค‘ ํ•˜๋‚˜๋ฅผ ํ…Œ์ŠคํŠธํ•œ ํ›„ ์šด์ด ์ข‹๊ฒŒ๋„ XHR ํด๋ง ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ์ „ํžˆ ์ผ๋ฐ˜ ๋…ธ๋“œ ์•ฑ์—์„œ ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ๋…ธ๋“œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—๋„ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” socket.io์˜ ๋‚ด์žฅ ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ ๋…ธ๋“œ ์•ฑ socket.io-client์—์„œ๋Š” ์œ„์™€ ๋™์ผํ•œ 503 xhr ํด๋ง ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋™์ผํ•œ ์ปดํ“จํ„ฐ์—์„œ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์ง€๋งŒ ํด๋ผ์ด์–ธํŠธ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋ฃจํ”„๋ฐฑ ๋˜๋Š” ๋กœ์ปฌ ๋„คํŠธ์›Œํฌ ์ฃผ์†Œ์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. socket.io ๋ฐ socket.io-client 1.7.3 ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋…ธ๋“œ์—์„œ ์‹คํ–‰ํ•  ๋•Œ ๋ฒ„์ „ 2.0.1 (ํด๋ผ์ด์–ธํŠธ ๋ฐ ์„œ๋ฒ„)์—์„œ๋„ ์ด ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

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

ํด๋ผ์ด์–ธํŠธ์—์„œ opts.transports ๋ฅผ websocket ๋กœ๋งŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

io.connect(url, { transports: ['websocket'] }); // default is ['polling', 'websocket']

์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•˜๊ธฐ ์ „์— ๋„ˆ๋ฌด ๋ณต์žกํ•œ ์†Œ์ผ“ ๋ฐ ์ž‘์—… ๋ฐ”์ธ๋”ฉ ๋…ผ๋ฆฌ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ฝ”๋“œ์˜ ์†Œ์ผ“ ๋…ผ๋ฆฌ๊ฐ€ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ๋””๋ฒ„๊ทธ๋ฅผ ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“œ์‹ญ์‹œ์˜ค.

์šด์†กํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ 1.7.4๋กœ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œํ–ˆ์œผ๋ฉฐ ๋ชจ๋‘ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์˜ˆ, 2.0.1์—์„œ 1.7.4๋กœ ๋ฒ„์ „์„ ๋‚ฎ์ถ”์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ 2.0.1 ๋กœ ๋‹ค์‹œ ์—…๊ทธ๋ ˆ์ด๋“œํ–ˆ๊ณ  ์›น ์†Œ์ผ“ ์ „์†ก๋งŒ ์‚ฌ์šฉํ•˜๋„๋ก ํด๋ผ์ด์–ธํŠธ๋ฅผ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ (๊ฑฐ์˜) ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค:

io(`localhost:8080`, {
    transports: [ 'websocket' ],
    upgrade: false
});

์ด์ œ ๋‚ด ์œ ์ผํ•œ ๋ฌธ์ œ๋Š” ์›น ์ž‘์—…์ž ๋ฒ”์œ„์— ๋Œ€ํ•ด websocket ์ „์†ก์ด ์ค‘๋‹จ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ฌธ์ œ๋ฅผ ์‹๋ณ„ํ•˜๊ณ  engine.io-client ์— ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ์—ด์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. https://github.com/socketio/engine.io-client/issues/569

์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๊นŒ? ๋””๋ฒ„๊ทธ๋ฅผ ํ™œ์„ฑํ™”ํ•œ ์ƒํƒœ์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ( DEBUG=engine* )

react-native์™€ ๊ด€๋ จํ•˜์—ฌ https://github.com/socketio/socket.io-client/issues/1114์— ๋งํฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

@darrachequesne ๊ทธ๋ž˜์„œ ๊ทธ๋ƒฅ ๋‚ด ์„œ๋ฒ„ ์ธก ํด๋ผ์ด์–ธํŠธ ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ๊ธฐ๋ณธ ์ „์†ก์œผ๋กœ ๋˜๋Œ๋ ธ์Šต๋‹ˆ๋‹ค. ๋‚ด ์‹ค์ˆ˜๋Š” ... ํˆฌํ‘œ ์ „์†ก์€ ํ™•์‹คํžˆ ๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ฐ€์ง„ ๋ฌธ์ œ๋Š” ๋กœ์ปฌ ๊ฐœ๋ฐœ์ž์— ๋Œ€ํ•œ ์ž์ฒด ์„œ๋ช… SSL ์ธ์ฆ์„œ์™€ ๊ด€๋ จ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž‘๋™ํ•˜๋ ค๋ฉด socket.io ๊ตฌ์„ฑ์— rejectUnauthorized: process.env.NODE_ENV === 'production' ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 503 ๋ฐ›๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์›น ์ž‘์—…์ž ๋ฌธ์ œ๋Š” ํ˜„์‹ค์ž…๋‹ˆ๋‹ค. socketio/engine.io-client#569

์ด ์‹œ๋„

require('socket.io-client')('http://localhost', {
  rejectUnauthorized:   false,
})

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ์‹œ๋„ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค
------ ์›๋ณธ ๋ฉ”์‹œ์ง€-----
๋ณด๋‚ธ ์‚ฌ๋žŒ: Zetsin [email protected]
๋ฐ›๋Š” ์‚ฌ๋žŒ: "socketio/socket.io-client" [email protected]
์ฐธ์กฐ: Wangzhiqiang [email protected] , ๋Œ“๊ธ€ [email protected]
์ œ๋ชฉ: Re: [socketio/socket.io-client] ๋””๋ฒ„๊ฑฐ๊ฐ€ ์žˆ์„ ๋•Œ XHR ํด๋ง ์˜ค๋ฅ˜๊ฐ€ ๋‚˜ํƒ€๋‚จ(#1097)
๋‚ ์งœ: 2017๋…„ 5์›” 20์ผ 16:22

์ด ์‹œ๋„
require('socket.io-client')('http://localhost', {
๊ฑฐ๋ถ€ ๊ถŒํ•œ ์—†์Œ: ๊ฑฐ์ง“,
})

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

๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋ฅผ ๋‹ค์Œ์œผ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

require('socket.io-client')('wss://myserver:port/ws', { transports: ['websocket'], rejectUnauthorized: false });

ํ•˜์ง€๋งŒ ์ง€๊ธˆ์€ 404 ์˜ค๋ฅ˜ ์‘๋‹ต์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. ๋กœ๊ทธ์— ๋‚ด ์š”์ฒญ URL์— ์ถ”๊ฐ€ /socket.io/ ์ถ”๊ฐ€๋œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

 { Error: unexpected server response (404)
       at ClientRequest._req.on (/Users/chris/Projects/nationsky/mgmt-server/backend/node_modules/ws/lib/WebSocket.js:650:26)
       at emitOne (events.js:115:13)
       at ClientRequest.emit (events.js:210:7)
       at HTTPParser.parserOnIncomingClient [as onIncoming] (_http_client.js:564:21)
       at HTTPParser.parserOnHeadersComplete (_http_common.js:116:23)
       at TLSSocket.socketOnData (_http_client.js:453:20)
       at emitOne (events.js:115:13)
       at TLSSocket.emit (events.js:210:7)
       at addChunk (_stream_readable.js:252:12)
       at readableAddChunk (_stream_readable.js:239:11)
     type: 'error',
     target:
      WebSocket {
        domain: null,
        _events: [Object],
        _eventsCount: 4,
        _maxListeners: undefined,
        readyState: 0,
        bytesReceived: 0,
        extensions: {},
        protocol: '',
        _binaryType: 'arraybuffer',
        _finalize: [Function: bound finalize],
        _finalizeCalled: false,
        _closeMessage: null,
        _closeTimer: null,
        _closeCode: null,
        _receiver: null,
        _sender: null,
        _socket: null,
        _ultron: null,
        protocolVersion: 13,
        _isServer: false,
        url: 'wss://myserver:port/socket.io/?access_token=HnbtDUEWu1i1HVrAn-DO9YOL6GZxoittWAf8Sz_RR0s&EIO=3&transport=websocket',
        _req: [Object] } } }

๋‚˜๋ฅผ ์œ„ํ•ด ๋””๋ฒ„๊ฑฐ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์•„๋„ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•! Node.js ์•ฑ์—์„œ ์„œ๋ฒ„๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ๋™์•ˆ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ œ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

const socket = require('socket.io-client')('https://domain.com')

DEBUG=engine* npm run dev ์‹คํ–‰ํ•œ ๋กœ๊ทธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

asciicast

engine.io-client:socket creating transport "polling" +2s
engine.io-client:polling polling +1ms
engine.io-client:polling-xhr xhr poll +0ms
engine.io-client:polling-xhr xhr open GET: https://domain.com/socket.io/?EIO=3&transport=polling&t=LzBM71r&b64=1 +0ms
engine.io-client:polling-xhr xhr data null +0ms
engine.io-client:socket setting transport polling +1ms
engine.io-client:socket socket error {"type":"TransportError","description":503} +7ms
engine.io-client:socket socket close with reason: "transport error" +0ms
engine.io-client:polling transport not open - deferring close +0ms

๋ธŒ๋ผ์šฐ์ €์—์„œ https://domain.com/socket.io/socket.io.js ์—ฐ๊ฒฐํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์ž‘๋™ํ•˜๊ณ  io('https://domain.com') ๋„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์ฃผ์„์˜ ์ง€์นจ์„ ๋”ฐ๋ฅด๊ณ  ๋‚ด ์ฝ”๋“œ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.

const socket = require('socket.io-client')('https://domain.com', { rejectUnauthorized: false })

๊ทธ๋ฆฌ๊ณ  ์ž‘๋™ํ–ˆ์ง€๋งŒ ์ด์ƒํ•ฉ๋‹ˆ๋‹ค. Let's Encrypt์˜ ์œ ํšจํ•œ ์ธ์ฆ์„œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์ •์ƒ์ž…๋‹ˆ๊นŒ? ์–ด์จŒ๋“  .. websocket ์ด์™ธ์˜ ๋‹ค๋ฅธ ์—ฐ๊ฒฐ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด transports ์˜ต์…˜(์ฃผ์„์—์„œ๋„)์„ ์ถ”๊ฐ€ํ–ˆ์œผ๋ฉฐ ๊ฒฐ๊ตญ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

const socket = require('socket.io-client')('https://domain.com', {
  transports: ['websocket'],
  rejectUnauthorized: false
})

๋•๋ถ„์— @ibrahimduran ๋ฐ @SupremeTechnopriest : ๋ฏธ์†Œ๋ฅผ :

Tarzan์ฒ˜๋Ÿผ ์ผ๋‹ค๋ฉด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค :sweat_smile: ์˜์–ด๋กœ ์ž‘์—… ์ค‘์ž…๋‹ˆ๋‹ค ํ•˜ํ•˜

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

   let socketClient = socketIOClient.connect(`http://localhost:3001`,{ // [1] Important as fuck 
      reconnectionDelay: 1000,
      reconnection:true,
      reconnectionAttempts: 10,
      transports: ['websocket'],
      agent: false, // [2] Please don't set this to true
      upgrade: false,
      rejectUnauthorized: false
   });

[1] http ๋˜๋Š” https ๋ฅผ ์‚ฌ์šฉํ• ์ง€ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’์€ https ์ž…๋‹ˆ๋‹ค. ๋˜๋Š” ๋‹น์‹ ์€ ๊ฐ™์€ URL ํ›„ ํฌํŠธ๋ฅผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ง€์ • ํ•ด๋‹ฌ๋ผ๊ณ  ๊ฒฝ์šฐ "URL. co.kr์—์„œ : ํฌํŠธ "ํ”„๋กœํ† ์ฝœ์— ๋”ฐ๋ผ 80 ๋˜๋Š” 443์— ๊ธฐ๋ณธ๊ฐ’์„. options ๊ฐœ์ฒด์—์„œ ์˜ต์…˜์œผ๋กœ ์ง€์ •๋œ ํฌํŠธ๊ฐ€ ์žˆ๋Š” ์ผ๋ถ€ stackoverflow ๋‹ต๋ณ€์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋‹ˆ ๊ทธ๋Ÿฐ ์˜ต์…˜์ด ์—†์Šต๋‹ˆ๋‹ค. URL์— ํฌํŠธ๋ฅผ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

[2] ๋˜ํ•œ ์—์ด์ „ํŠธ๋ฅผ true๋กœ ์„ค์ •ํ–ˆ๋Š”๋ฐ ws ์—ฐ๊ฒฐ ์„ค์ •์— ์‹คํŒจํ–ˆ๊ณ  ์˜ค๋ฅ˜๊ฐ€ ์—†์—ˆ๊ณ  ๋‹จ์ˆœํžˆ ์‹œ๊ฐ„ ์ดˆ๊ณผ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์—์ด์ „ํŠธ๋ฅผ ์ „ํ˜€ ์ง€์ •ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๊ธฐ๋ณธ๊ฐ’์€ false์ž…๋‹ˆ๋‹ค.

@ teja42 2์ผ ๋™์•ˆ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด webpack๊ณผ์˜ ๋ฒˆ๋“ค ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ ๋‹น์‹ ์˜ ์†”๋ฃจ์…˜์€ ํ›Œ๋ฅญํ•˜๊ฒŒ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”!

์•ˆ๋…• !

๋‚˜๋Š” ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๊ณ  @SupremeTechnopriest๊ฐ€ ๋งํ•œ๋Œ€๋กœ 2.0.1์—์„œ 1.7.4๋กœ ๋‹ค์šด ๊ทธ๋ ˆ์ด๋“œ๋ฅผ ์ˆ˜์ •ํ–ˆ์œผ๋ฉฐ ๋ชจ๋“  ๊ฒƒ์ด ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค!

๊ฐ์‚ฌ !

์•ˆ๋…•ํ•˜์„ธ์š”, Android 8.1์—์„œ ์—ฌ์ „ํžˆ ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์˜์‚ฌ ์ฝ”๋“œ:
```
this.socket = io.connect('https://xxxxxxxxxxxxxx', {
๊ฒฝ๋กœ: '/์†Œ์ผ“ ์ฑ„๋„',
์žฌ์—ฐ๊ฒฐ ์ง€์—ฐ: 1000,
์žฌ์—ฐ๊ฒฐ: ์‚ฌ์‹ค,
์žฌ์—ฐ๊ฒฐ ์‹œ๋„: 10,
์ „์†ก: ['์›น ์†Œ์ผ“'],
์—์ด์ „ํŠธ: ๊ฑฐ์ง“,
์—…๊ทธ๋ ˆ์ด๋“œ: ๊ฑฐ์ง“,
๊ฑฐ๋ถ€ ๊ถŒํ•œ ์—†์Œ: ๊ฑฐ์ง“
});

this.socket.on('์—ฐ๊ฒฐ', () => {
console.log('์†Œ์ผ“์ด ์—ฐ๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!')
})
this.socket.on('connect_error', (์˜ค๋ฅ˜) => {
console.log('์†Œ์ผ“ ์—ฐ๊ฒฐ ์˜ค๋ฅ˜ --> ' + err);
})

```
์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ 'connection_error' ์ด๋ฒคํŠธ๋กœ ์ด๋™ํ•˜๊ณ  "์˜ค๋ฅ˜: websocket ์˜ค๋ฅ˜"๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

"๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ": "0.57.4",
"socket.io-client": "1.7.4"

์–ด๋–ค ์ œ์•ˆ?

์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ 'connection_error' ์ด๋ฒคํŠธ๋กœ ์ด๋™ํ•˜๊ณ  "์˜ค๋ฅ˜: websocket ์˜ค๋ฅ˜"๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

๊ฐ™์€ ๋ฌธ์ œ์— ์ง๋ฉด

    "react-native": "https://github.com/expo/react-native/archive/sdk-32.0.0.tar.gz",
    "engine.io-client": "~3.3.2",
    "socket.io-client": "2.1.1",

๋™์ผํ•œ ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

+1

์†Œ์ผ“ ์„œ๋ฒ„์˜ origins ๋•Œ๋ฌธ์— ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
์ด์ œ ์ถœ์ฒ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์•ˆ๋…• ๋ชจ๋‘. ๊ทธ๋ž˜์„œ ๋…ธ๋“œ ์ต์Šคํ”„๋ ˆ์Šค ์„œ๋ฒ„์— PM2 ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  redis ์–ด๋Œ‘ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

const redis = require('socket.io-redis') 
io.adapter(redis(config.redis))

๋ธŒ๋ผ์šฐ์ € ํด๋ผ์ด์–ธํŠธ์˜ ๊ฒฝ์šฐ ์ด๊ฒƒ์€ ๊ดœ์ฐฎ์•„ ๋ณด์ด์ง€๋งŒ socket.io-client์˜ ๊ฒฝ์šฐ ๋‹ค์Œ์„ ์–ป์Šต๋‹ˆ๋‹ค.

{ Error: xhr post error
    at XHR.Transport.onError (/home/user/Desktop/nodeclienttest/node_modules/engine.io-client/lib/transport.js:67:13)
    at Request.<anonymous> (/home/user/Desktop/nodeclienttest/node_modules/engine.io-client/lib/transports/polling-xhr.js:111:10)
    at Request.Emitter.emit (/home/user/Desktop/nodeclienttest/node_modules/component-emitter/index.js:133:20)
    at Request.onError (/home/user/Desktop/nodeclienttest/node_modules/engine.io-client/lib/transports/polling-xhr.js:311:8)
    at Timeout._onTimeout (/home/user/Desktop/nodeclienttest/node_modules/engine.io-client/lib/transports/polling-xhr.js:258:18)
    at listOnTimeout (timers.js:327:15)
    at processTimers (timers.js:271:5) type: 'TransportError', description: 400 }
{ Error: xhr poll error
    at XHR.Transport.onError (/home/user/Desktop/nodeclienttest/node_modules/engine.io-client/lib/transport.js:67:13)
    at Request.<anonymous> (/home/user/Desktop/nodeclienttest/node_modules/engine.io-client/lib/transports/polling-xhr.js:130:10)
    at Request.Emitter.emit (/home/user/Desktop/nodeclienttest/node_modules/component-emitter/index.js:133:20)
    at Request.onError (/home/user/Desktop/nodeclienttest/node_modules/engine.io-client/lib/transports/polling-xhr.js:311:8)
    at Timeout._onTimeout (/home/user/Desktop/nodeclienttest/node_modules/engine.io-client/lib/transports/polling-xhr.js:258:18)
    at listOnTimeout (timers.js:327:15)
    at processTimers (timers.js:271:5) type: 'TransportError', description: 400 }

์›น ์†Œ์ผ“ ์ „์†ก์„ ์‚ฌ์šฉํ•˜๋„๋ก ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ชจ๋‘ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

var socket = require("socket.io-client")("http://localhost:8080", { transports: ['websocket'] });

๋ฌธ์ œ๋Š” ์ด ์ฝ”๋“œ๋ฅผ ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ์— ๋ณ€๊ฒฝํ•˜๋„๋ก ์š”๊ตฌํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด ๊ถŒ์žฅ ์‚ฌํ•ญ์€ xhr ํด๋ง ์ „์†ก์ด ์‹คํŒจํ•˜๋Š” ๊ฒฝ์šฐ ์›น ์†Œ์ผ“ ์ „์†ก์„ ์‹œ๋„ํ•˜๋„๋ก socket.io-client๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•ด?

๋‹ค์Œ๊ณผ ๊ฐ™์ด github์—์„œ ๋งˆ์ง€๋ง‰ ๋ฒ„์ „์„ ์‹œ๋„ํ•˜๊ณ  RN android ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

npm i socketio/engine.io-client#3.3.2 -S

๊ฑด๋ฐฐ

์ด ์†”๋ฃจ์…˜์ด ์•ฝ๊ฐ„ ์ด์ƒํ•˜๊ฒŒ ๋“ค๋ฆด ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์ด ์˜ค๋ฅ˜๋ฅผ ์ธํ„ฐ๋„ท ๊ฒ€์ƒ‰ํ•˜์—ฌ ์—ฌ๊ธฐ๊นŒ์ง€ ์™”์Šต๋‹ˆ๋‹ค.

์ œ ๊ฒฝ์šฐ์—๋Š” ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค(๊ทธ๋ ‡๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค). ๊ทธ๊ฒƒ์ด ๋‹ค๋ฅธ ๋ˆ„๊ตฐ๊ฐ€๋ฅผ ๋•๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค :)

์ด ์‹œ๋„

require('socket.io-client')('http://localhost', {
  rejectUnauthorized:   false,
})

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋‚ด ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ์†”๋ฃจ์…˜์€ ์ €์—๊ฒŒ ํšจ๊ณผ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ์‹œ๋„

require('socket.io-client')('http://localhost', {
  rejectUnauthorized:   false,
})

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋‚ด ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ์†”๋ฃจ์…˜์€ ์ €์—๊ฒŒ ํšจ๊ณผ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.
์•ˆ๋…•ํ•˜์„ธ์š”, ์–ด๋–ค ๋ฒ„์ „์˜ socket.io์™€ socket.io-client๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

์ด ์‹œ๋„

require('socket.io-client')('http://localhost', {
  rejectUnauthorized:   false,
})

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋‚ด ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ์†”๋ฃจ์…˜์€ ์ €์—๊ฒŒ ํšจ๊ณผ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.
์•ˆ๋…•ํ•˜์„ธ์š”, ์–ด๋–ค ๋ฒ„์ „์˜ socket.io์™€ socket.io-client๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

๋ฒ„์ „ 2.3.0์—์„œ socket.io์™€ socket.io-client๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”, Android 8.1์—์„œ ์—ฌ์ „ํžˆ ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์˜์‚ฌ ์ฝ”๋“œ:

this.socket = io.connect('https://xxxxxxxxxxxxxx', { 
     path: '/socketchannel', 
     reconnectionDelay: 1000,
     reconnection:true,
     reconnectionAttempts: 10,
     transports: ['websocket'],
     agent: false, 
     upgrade: false,
     rejectUnauthorized: false
   });

this.socket.on('connect', () => {
     console.log('socket connected!')
   })
this.socket.on('connect_error', (err) => {
     console.log('socket connected error --> ' + err);
   })

์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ 'connection_error' ์ด๋ฒคํŠธ๋กœ ์ด๋™ํ•˜๊ณ  "์˜ค๋ฅ˜: websocket ์˜ค๋ฅ˜"๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

"๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ": "0.57.4",
"socket.io-client": "1.7.4"

์–ด๋–ค ์ œ์•ˆ?

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

๋„๋ฉ”์ธ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

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