socket.io와 웹 소켓의 차이점


459

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

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

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

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

이것을 명확히하십시오.


6
웹 관리자가 트래픽을 포착하지 못하는 이유에 대해서는 Firebug 또는 기타를 사용하여 WS / WSS Websocket 요청 컨텐츠를
treaz

1
@treaz 당신은 Firebug 또는 다른 것을 필요로하지 않습니다. Chrome의 devtools는 네트워크 탭 아래에 WS 연결을 표시합니다.

이것도 확인하십시오 (최신인지 확실하지 않음) -educba.com/websocket-vs-socket-io
Manohar Reddy Poreddy

답변:


326

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

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

http://davidwalsh.name/websocket


63
Socket.IO는 WebSocket을 기반으로 구축 된 것이 아니라 사용 가능한 경우에만이 기술을 사용합니다.
moka

24
의미상의 차이점과 나머지 답변에서 설명했지만 답변을 업데이트했습니다.
Timothy Strimple

1
@ moka, 당신의 말에서 다음 진술이 잘못되었다고 결론 지을 수 있습니까? Socket.IO는 실제로 WebSockets 이상의 계층입니다.
Pulak Kanti Bhattacharyya

3
@PulakKantiBhattacharyya 정확히 어떤 문장을 언급하고 있는지 지정할 수 있습니까? Socket.IO는 WebSockets의 단순한 계층 이상의 의미를 지니고 있으며, 의미가 다르며 (이름을 사용하여 메시지 표시) 하트 비트 메커니즘과 다른 프로토콜로 페일 오버합니다. 이것에 더하여 ID는 서버 측의 클라이언트에 연결됩니다. 따라서 랩퍼 일뿐 아니라 모든 기능을 갖춘 라이브러리입니다. 실제로 최근 몇 년 동안 잘 지원되지 않았기 때문에 Socket.IO의 대안으로 더 우수하고 유지 관리되는 SockJS를 사용하는 것이 좋습니다.
moka

4
@moka 한 달 전에 나는 당신과 동의했을 것입니다. Socket.io 1.0이 현재 업데이트 중입니다.
Timothy Strimple

536

오해

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 를 참조 하십시오 .


23
그래서 기본적으로 당신이 말하는 것은 websocket이 socket.io보다 낫다는 것입니다.
Jack Moscovi

42
@ JackMoscovi WebSocket이 반드시 더 좋다고 말하지는 않습니다. 그것은 모두 요구 사항에 달려 있습니다. WebSocket의 장점은 웹 표준 (W3C 및 whatwg, 현재 IETF에서 5 년 전에 게시 된 RFC)에서 웹 표준이라는 점이며, 브라우저에서 기본적으로 지원하기 때문에 매우 가볍지 만 브라우저 지원은 훌륭하지만 보편적이지 않습니다. Socket.IO는 더 많은 브라우저를 지원하고 더 많은 기능을 제공하지만 약간의 오버 헤드도 제공합니다. 때로는 하나가 더 좋으며 때로는 다른 것이 좋습니다. 그것은 querySelectorAll와 jQuery를 사이의 선택처럼 - 대답은 항상 동일하지 않습니다
RSP

20
여기에 좋은 대답 !! 대부분의 경우 socket.io가 더 이상 필요하지 않은 것 같습니다 ...이 위대한 기사도 참조하십시오! medium.com/@ivanderbyl/…
Alvaro

4
@ rsp 나는이 예제들이 기능적으로 동일하다고 생각하지 않습니까? Socket-io는 중단 될 때 자동 재연 결과 같은 것을 처리하며 (모바일 장치에서 발생 함) 처리되는 보안 관련 문제가 있다고 생각합니까? 일반 WS 예제는 기능적으로 동일하지만 이러한 특성이 없습니다.
mindplay.dk

28
아주 좋은 비교. 그러나 Socket.io는 방 이름 간격, 수많은 연결 세부 정보, 많은 로깅 세부 정보를 추가하고 Angular, Vue, React 및 기타와 함께 Socket.IO에 대한 많은 통합 라이브러리가 있음을 주목할 가치가 있습니다. 가장 중요한 것은 Ajax 롱 폴링을 비활성화하고 원시 WebSocket 연결처럼 WebSocket을 통해 직접 연결할 수 있습니다. 이런 식으로 180kb 라이브러리를 제외한 모든 것을 동일하게 얻을 수 있습니다. 최소한의 정보 만 필요한 경우가 아니면 WebSocket을 직접 사용하는 것은 고통 스럽습니다. 방을 떨어 뜨리고 커뮤니티 IP에 액세스하는 것은 기업에게 어려운 일입니다.
Nick Steele

30

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 모듈은 놀랍도록 사용하기 쉽습니다.


무엇 당신은 우리가 MySQL과 상호 작용하는 데 사용 되죠 -> express.js / fastify.js 나 앱 채팅 빌드 Android 및 iOS에 ... 바로 Node.js를
DragonFire

25

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


3

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

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

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

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


2

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


0

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');
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.