[node.js] socket.io와 웹 소켓의 차이점

node.js에서 socket.io와 websockets의 차이점은 무엇입니까?
둘 다 서버 푸시 기술입니까? 내가 느낀 유일한 차이점은

  1. socket.io를 사용하면 이벤트 이름을 지정하여 메시지를 보내거나 보낼 수있었습니다.

  2. socket.io의 경우 서버의 메시지가 모든 클라이언트에서 도달하지만 웹 소켓에서 동일하게 모든 연결 배열을 유지하고 반복하여 모든 클라이언트에게 메시지를 보냅니다.

또한 왜 웹 관리자 (예 : Chrome / firebug / fiddler)가 서버에서 이러한 메시지 (socket.io/websocket에서)를 잡을 수 없는지 궁금합니다.

이것을 명확히하십시오.



답변

이것의 장점은 # 2에서 설명한 것처럼 WebSocket의 사용을 단순화한다는 것입니다. 더 중요한 것은 WebSocket이 브라우저 나 서버에서 지원되지 않는 경우 다른 프로토콜에 대한 페일 오버를 제공한다는 것입니다. 작동하지 않는 환경에 대해 잘 알고 있고 이러한 제한을 해결할 수 없다면 WebSocket을 직접 사용하지 마십시오.

이것은 WebSocket과 Socket.IO 모두에서 잘 읽습니다.

http://davidwalsh.name/websocket


답변

오해

WebSocket 및 Socket.IO에 대한 일반적인 오해는 거의 없습니다.

  1. 첫 번째 오해는 Socket.IO를 사용하는 것이 WebSocket을 사용하는 것보다 훨씬 쉽다는 것입니다. 아래 예를 참조하십시오.

  2. 두 번째 오해는 WebSocket이 브라우저에서 널리 지원되지 않는다는 것입니다. 자세한 내용은 아래를 참조하십시오.

  3. 세 번째 오해는 Socket.IO가 이전 브라우저에서 폴백으로 연결을 다운 그레이드한다는 것입니다. 실제로 브라우저가 오래되고 서버에 대한 AJAX 연결을 시작한다고 가정합니다.이 트래픽은 일부 트래픽이 교환 된 후 나중에 WebSocket을 지원하는 브라우저에서 업그레이드됩니다. 자세한 내용은 아래를 참조하십시오.

내 실험

WebSocket과 Socket.IO의 차이점을 보여주기 위해 npm 모듈을 작성했습니다.

서버 측 및 클라이언트 측 코드의 간단한 예입니다. 클라이언트는 WebSocket 또는 Socket.IO를 사용하여 서버에 연결하고 서버는 1 초 간격으로 3 개의 메시지를 보내며 클라이언트는 DOM에 추가합니다.

서버 측

Express.js 앱에서 WebSocket과 Socket.IO를 사용하는 서버 측 예제를 비교해보십시오 :

웹 소켓 서버

Express.js를 사용하는 WebSocket 서버 예제 :

var path = require('path');
var app = require('express')();
var ws = require('express-ws')(app);
app.get('/', (req, res) => {
  console.error('express connection');
  res.sendFile(path.join(__dirname, 'ws.html'));
});
app.ws('/', (s, req) => {
  console.error('websocket connection');
  for (var t = 0; t < 3; t++)
    setTimeout(() => s.send('message from server', ()=>{}), 1000*t);
});
app.listen(3001, () => console.error('listening on http://localhost:3001/'));
console.error('websocket example');

출처 : https://github.com/rsp/node-websocket-vs-socket.io/blob/master/ws.js

Socket.IO 서버

Express.js를 사용하는 Socket.IO 서버 예제 :

var path = require('path');
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
app.get('/', (req, res) => {
  console.error('express connection');
  res.sendFile(path.join(__dirname, 'si.html'));
});
io.on('connection', s => {
  console.error('socket.io connection');
  for (var t = 0; t < 3; t++)
    setTimeout(() => s.emit('message', 'message from server'), 1000*t);
});
http.listen(3002, () => console.error('listening on http://localhost:3002/'));
console.error('socket.io example');

출처 : https://github.com/rsp/node-websocket-vs-socket.io/blob/master/si.js

고객 입장에서

브라우저에서 WebSocket과 Socket.IO를 사용하는 클라이언트 쪽 예제를 비교하십시오.

WebSocket 클라이언트

바닐라 JavaScript를 사용하는 WebSocket 클라이언트 예제 :

var l = document.getElementById('l');
var log = function (m) {
    var i = document.createElement('li');
    i.innerText = new Date().toISOString()+' '+m;
    l.appendChild(i);
}
log('opening websocket connection');
var s = new WebSocket('ws://'+window.location.host+'/');
s.addEventListener('error', function (m) { log("error"); });
s.addEventListener('open', function (m) { log("websocket connection open"); });
s.addEventListener('message', function (m) { log(m.data); });

출처 : https://github.com/rsp/node-websocket-vs-socket.io/blob/master/ws.html

Socket.IO 클라이언트

바닐라 JavaScript를 사용하는 Socket.IO 클라이언트 예 :

var l = document.getElementById('l');
var log = function (m) {
    var i = document.createElement('li');
    i.innerText = new Date().toISOString()+' '+m;
    l.appendChild(i);
}
log('opening socket.io connection');
var s = io();
s.on('connect_error', function (m) { log("error"); });
s.on('connect', function (m) { log("socket.io connection open"); });
s.on('message', function (m) { log(m); });

출처 : https://github.com/rsp/node-websocket-vs-socket.io/blob/master/si.html

네트워크 트래픽

네트워크 트래픽의 차이를 확인하려면 테스트를 실행할 수 있습니다 . 내가 얻은 결과는 다음과 같습니다.

WebSocket 결과

요청 2 개, 1.50KB, 0.05 초

그 두 가지 요청에서

  1. HTML 페이지 자체
  2. WebSocket으로의 연결 업그레이드

연결 업그레이드 요청은 개발자 도구에서 101 개의 스위칭 프로토콜 응답으로 볼 수 있습니다.

Socket.IO 결과

요청 6 개, 181.56KB, 0.25 초

그 6 가지 요청에서 :

  1. HTML 페이지 자체
  2. Socket.IO의 JavaScript (180 킬로바이트)
  3. 첫 번째 긴 폴링 AJAX 요청
  4. 두 번째 긴 폴링 AJAX 요청
  5. 세 번째 긴 폴링 AJAX 요청
  6. WebSocket으로의 연결 업그레이드

스크린 샷

localhost에 얻은 WebSocket 결과 :

WebSocket 결과-websocket-vs-socket.io 모듈

localhost에서 얻은 Socket.IO 결과 :

Socket.IO 결과-websocket-vs-socket.io 모듈

자신을 테스트

빠른 시작:

# Install:
npm i -g websocket-vs-socket.io
# Run the server:
websocket-vs-socket.io

열기 에 http : // localhost를 : 3001 / 브라우저에서, Shift + Ctrl 키 + I 열린 개발자 도구, 네트워크 탭을 열고 웹 소켓 버전에 대한 네트워크 트래픽을 볼 수 Ctrl 키 + R로 페이지를 다시로드합니다.

열기 에 http : // localhost를 : 3002 / 브라우저에서, Shift + Ctrl 키 + I 열린 개발자 도구, 네트워크 탭을 열고 Socket.IO 버전에 대한 네트워크 트래픽을 볼 수 Ctrl 키 + R로 페이지를 다시로드합니다.

제거하려면 :

# Uninstall:
npm rm -g websocket-vs-socket.io

브라우저 호환성

2016 년 6 월 현재 WebSocket은 9보다 높은 IE를 포함하여 Opera Mini를 제외한 모든 항목에서 작동합니다.

2016 년 6 월 기준으로 사용할 수 있는 WebSocket의 브라우저 호환성입니다 .

여기에 이미지 설명을 입력하십시오

최신 정보는 http://caniuse.com/websockets 를 참조 하십시오 .


답변

socket.io 사용에 대한 인수를 제공하려고합니다.

폴 백이 있기 때문에 socket.io 만 사용하는 것은 좋은 생각이 아닙니다. IE8 RIP를 보자.

과거에는 새로운 버전의 NodeJS가 socket.io를 깨뜨린 경우가 많이있었습니다. 예를 들어이 목록을 확인할 수 있습니다 … https://github.com/socketio/socket.io/issues?q=install+error

Android 앱이나 기존 앱과 함께 작동 해야하는 무언가를 개발하려는 경우 WS로 즉시 작업해도 괜찮을 것입니다. socket.io가 문제를 일으킬 수 있습니다 …

또한 Node.JS 용 WS 모듈은 놀랍도록 사용하기 쉽습니다.


답변

Socket.IO를 사용하는 것은 기본적으로 jQuery를 사용하는 것과 같습니다. 구형 브라우저를 지원하려면 더 적은 코드를 작성해야하며 라이브러리는 폴백을 제공합니다. Socket.io는 사용 가능한 경우 웹 소켓 기술을 사용하고, 사용 불가능한 경우 사용 가능한 최상의 통신 유형을 확인하여 사용합니다.


답변

최신 브라우저가 현재 WebSocket을 지원하더라도 SocketIO를 버릴 필요가 없으며 현재 프로젝트에서 여전히 자리 잡고 있습니다. 이해하기 쉽고 개인적으로 SocketIO 덕분에 WebSockets의 작동 방식을 배웠습니다.

이 주제에서 언급했듯이 Angular, React 등에 대한 많은 통합 라이브러리와 TypeScript 및 기타 프로그래밍 언어에 대한 정의 유형이 있습니다.

Socket.io와 WebSockets의 차이점에 덧붙일 다른 점은 Socket.io를 사용한 클러스터링이 큰 문제가 아니라는 것입니다. Socket.io는 확장 성을 향상시키기 위해 Redis와 연결하는 데 사용할 수있는 어댑터 를 제공합니다 . 당신은이 ioredissocket.io – 레디 스 예를 들어.

예, SocketCluster 가 존재하지만 주제가 맞지 않습니다.


답변

Socket.IO는 WebSocket을 사용하며 WebSocket을 사용할 수없는 경우 대체 연결을 사용하여 실시간 연결을 설정합니다.


답변

https://socket.io/docs/#What-Socket-IO-is-not (내 강조 와 함께 )

Socket.IO가 아닌 것

Socket.IO는 WebSocket 구현 이 아닙니다 . Socket.IO는 가능한 경우 WebSocket을 전송으로 사용하지만, 메시지 확인이 필요할 때 패킷 유형, 네임 스페이스 및 패킷 ID와 같은 메타 데이터를 각 패킷에 추가합니다. 이유입니다 웹 소켓 클라이언트가됩니다 없습니다 성공적으로 Socket.IO 서버에 연결할 수Socket.IO 클라이언트는 것입니다 하지 웹 소켓 서버에 연결할 수 중 하나. 프로토콜 사양은 여기를 참조 하십시오 .

// WARNING: the client will NOT be able to connect!
const client = io('ws://echo.websocket.org');