socket.ioとwebsocketsの違い


459

node.jsのsocket.ioとwebsocketsの違いは何ですか?
どちらもサーバープッシュテクノロジーですか?私が感じた唯一の違いは、

  1. socket.ioを使用すると、イベント名を指定してメッセージを送受信できます。

  2. socket.ioの場合、サーバーからのメッセージはすべてのクライアントに届きますが、websocketでは同じようにすべての接続の配列を保持し、それをループしてすべてのクライアントにメッセージを送信するように強制されました。

また、なぜWebインスペクター(Chrome / firebug / fiddlerなど)がこれらのメッセージ(socket.io/websocketから)をサーバーからキャッチできないのでしょうか?

これを明確にしてください。


6
Webインスペクターがトラフィックをキャッチしない理由については、Firebugまたはその他を使用してWS / WSS Websocket要求コンテンツを表示する方法を
treaz 2012年

1
@treazあなたはFirebugや他のものを必要としません。Chromeの開発ツールでは、[ネットワーク]タブにWS接続が表示されます。

これもチェックしてください(これが最新かどうかはわかり
Manohar Reddy Poreddy

回答:


326

その利点は、#2で説明したようにWebSocketの使用を簡素化することです。おそらくより重要なのは、WebSocketがブラウザーまたはサーバーでサポートされていない場合に、他のプロトコルへのフェイルオーバーを提供することです。WebSocketが機能しない環境に精通していて、それらの制限を回避できる場合を除いて、WebSocketを直接使用することは避けます。

これは、WebSocketsとSocket.IOの両方でよく読んでいます。

http://davidwalsh.name/websocket


63
Socket.IOはWebSocketsの上に構築されていません。このテクノロジーが利用可能な場合に使用します。
moka

24
セマンティックの違いと私はそれを残りの回答で説明しましたが、これを反映するように回答を更新しました。
Timothy Strimple

1
@moka、あなたの言葉から、私は次のステートメントが間違っていると結論付けることができますか?Socket.IOは実際にはWebSockets上のレイヤー以上のものです。
Pulak Kanti Bhattacharyya 2014

3
@PulakKantiBhattacharyya正確にあなたが言及しているステートメントを特定していただけませんか?Socket.IOは、WebSocketの単なるレイヤー以上のものであり、セマンティクスが異なり(メッセージに名前を付ける)、さまざまなプロトコルへのフェイルオーバーを実行し、ハートビートメカニズムも備えています。さらに、サーバー側のクライアントにIDを付加します。そのため、単なるラッパーではなく、フル機能のライブラリです。実際、ここ数年はあまりサポートされていないので、Socket.IOに代わる、より優れた、より維持されたSockJSを使用することをお勧めします。
moka 2014

4
@moka 1か月前、私はあなたに同意したでしょう。Socket.io 1.0がリリースされ、更新されています。
Timothy Strimple 2014

537

誤解

WebSocketとSocket.IOに関する一般的な誤解はほとんどありません。

  1. 最初の誤解は、Socket.IOを使用する方がWebSocketを使用するよりもはるかに簡単であるということです。以下の例を参照してください。

  2. 2つ目の誤解は、WebSocketがブラウザーで広くサポートされていないことです。詳細については、以下を参照してください。

  3. 3つ目の誤解は、Socket.IOが古いブラウザーのフォールバックとして接続をダウングレードすることです。実際には、ブラウザーが古いものであると想定し、サーバーへのAJAX接続を開始します。これは、トラフィックが交換された後で、WebSocketをサポートするブラウザーでアップグレードされます。詳細については、以下を参照してください。

私の実験

WebSocketとSocket.IOの違いを示すために、npmモジュールを作成しました。

これはサーバー側とクライアント側のコードの簡単な例です。クライアントはWebSocketまたはSocket.IOを使用してサーバーに接続し、サーバーは1秒間隔で3つのメッセージを送信します。これらのメッセージはクライアントによってDOMに追加されます。

サーバ側

WebSocketとSocket.IOを使用してExpress.jsアプリで同じことを行うサーバー側の例を比較します。

WebSocketサーバー

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.50 KB、0.05秒

これらの2つのリクエストから:

  1. HTMLページ自体
  2. WebSocketへの接続アップグレード

(接続アップグレード要求は、101 Switching Protocols応答で開発者ツールに表示されます。)

Socket.IOの結果

6リクエスト、181.56 KB、0.25秒

これらの6つのリクエストから:

  1. HTMLページ自体
  2. Socket.IOのJavaScript(180キロバイト)
  3. 最初のロングポーリングAJAXリクエスト
  4. 2番目の長いポーリングAJAX要求
  5. 3番目の長いポーリングAJAX要求
  6. WebSocketへの接続アップグレード

スクリーンショット

ローカルホストで取得した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とのオープン開発ツール、[ネットワーク]タブを開き、WebSocketのバージョンのネットワークトラフィックを参照してくださいするには、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よりも優れているということですか?
ジャックモスコビ16

42
@JackMoscovi WebSocketが必ずしも優れているとは言えません。それはすべて要件に依存します。WebSocketの利点は、それがWeb標準であること(最初はW3Cとwhatwg、現在はIETFの下で、RFCは5年前に公開)であり、ブラウザーによってネイティブでサポートされているため、非常に軽量ですが、良好な状態でのブラウザーサポートは普遍的ではありません。Socket.IOは、より多くのブラウザーをサポートし、より多くの機能を備えていますが、オーバーヘッドも伴います。時々一方がよりよい時、時々他方。これはquerySelectorAllとjQueryの間で選択するようなものです-答えは常に同じではありません
rsp

20
ここで素晴らしい答え!! 多くの場合、socket.ioはもう必要ないようです...この素晴らしい記事も参照してください!medium.com/@ivanderbyl/...
アルバロ

4
@rspこれらの例は機能的に同等ではないと思いますか?Socket-ioは(モバイルデバイスで発生する)中断時の自動再接続などを処理しますが、処理されるセキュリティ上の懸念があると思いますか?単純なWSの例は、機能的には同等ですが、これらのプロパティはありません。
mindplay.dk 2017

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またはnode.jsと直接対話するために何を使用することをお勧めしますか?AndroidおよびiOSチャットアプリを構築するために
DragonFire

25

Socket.IOの使用は、基本的にjQueryの使用に似ています。古いブラウザーをサポートしたい場合は、作成するコードを少なくする必要があり、ライブラリはフォールバックを提供します。Socket.ioは、利用可能な場合はwebsocketsテクノロジーを使用し、利用できない場合は、利用可能な最良の通信タイプをチェックして使用します。


3

現在のブラウザーがWebSocketをサポートしている場合でも、SocketIOを破棄する必要はなく、現在のプロジェクトでもその位置を保っています。理解しやすく、個人的には、SocketIOのおかげでWebSocketがどのように機能するかを学びました。

このトピックで述べたように、Angular、Reactなどの統合ライブラリや、TypeScriptやその他のプログラミング言語の定義タイプがたくさんあります。

Socket.ioとWebSocketsの違いに追加するもう1つの点は、Socket.ioを使用したクラスタリングは大したことではないということです。Socket.ioはアダプターを提供しており、アダプターをRedisとリンクしてスケーラビリティーを強化できます。あなたは持っているioredissocket.io-Redisの例を。

はい、わかっています。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です。そのため、WebSocketクライアントはSocket.IOサーバーに正常に接続できSocket.IOクライアントもWebSocketサーバーに接続できませんこちらのプロトコル仕様をご覧ください。

// 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.