सॉकेट.आईओ और वेबसोकेट के बीच अंतर


458

नोड.जेएस में सॉकेट.आईओ और वेबसोकेट के बीच अंतर क्या हैं?
क्या वे दोनों सर्वर पुश तकनीक हैं? केवल अंतर मुझे लगा,

  1. socket.io ने मुझे ईवेंट नाम निर्दिष्ट करके संदेश भेजने / उत्सर्जित करने की अनुमति दी।

  2. सॉकेट के मामले में, सर्वर से एक संदेश सभी ग्राहकों तक पहुंच जाएगा, लेकिन वेबसोकेट्स में उसी के लिए मुझे सभी ग्राहकों के लिए संदेश भेजने के लिए सभी कनेक्शन और लूप के माध्यम से रखने के लिए मजबूर किया गया था।

इसके अलावा, मुझे आश्चर्य है कि वेब निरीक्षक (जैसे क्रोम / फायरबग / फ़िडलर) सर्वर से इन संदेशों (socket.io/websocket) को पकड़ने में असमर्थ हैं?

कृपया इसे स्पष्ट करें।


6
वेब इंस्पेक्टर ट्रैफ़िक क्यों नहीं पकड़ते हैं, इस बारे में: देखें कि फायरबग या अन्य का उपयोग करके WS / WSS वेबसोकेट अनुरोध सामग्री कैसे
treaz

1
@treaz आपको Firebug या कुछ और की जरूरत नहीं है। Chrome के devtools नेटवर्क टैब के अंतर्गत WS कनेक्शन दिखाते हैं।

इसे भी जांचें (यदि यह नवीनतम है तो निश्चित नहीं है) - educationba.com/websocket-vs-socket-io
मनोहर रेड्डी पॉर्ड्डी

जवाबों:


325

इसके फायदे यह हैं कि यह # 2 में बताए अनुसार वेबसॉकेट के उपयोग को सरल बनाता है, और शायद इससे भी महत्वपूर्ण बात यह है कि यह उस स्थिति में अन्य प्रोटोकॉल को विफल-ओवर प्रदान करता है जो वेबसर्वर ब्राउज़र या सर्वर पर समर्थित नहीं हैं। जब तक आप उन वातावरण से काम नहीं करते हैं और आप उन सीमाओं के आसपास काम करने में सक्षम नहीं हैं, तब तक मैं सीधे वेबस्कॉफ़्ट का उपयोग करने से बचूँगा।

यह WebSockets और Socket.IO दोनों पर एक अच्छा पढ़ा गया है।

http://davidwalsh.name/websocket


63
सॉकेट.आईओ वेबसॉकेट्स के शीर्ष पर नहीं बना है, यह बस उपलब्ध होने पर इस तकनीक का उपयोग करता है।
मोका

24
शब्दार्थ अंतर और मैंने समझाया कि शेष उत्तर में, लेकिन मैंने इसे प्रतिबिंबित करने के लिए उत्तर अपडेट कर दिया है।
तीमुथियुस Strimple

1
@ आपके शब्दों से, क्या मैं यह निष्कर्ष निकाल सकता हूं कि निम्नलिखित कथन गलत है? सॉकेट.आईओ वास्तव में वेबस्केट्स पर एक परत से अधिक है।
पुलक कांति भट्टाचार्य १०'१४ को

3
@PulakKantiBhattacharyya क्या आप यह निर्दिष्ट कर सकते हैं कि आप किस कथन का उल्लेख कर रहे हैं? सॉकेट.आईओ वेबसॉकेट्स के ऊपर एक परत की तुलना में अधिक है, इसमें विभिन्न शब्दार्थ (नाम के साथ संदेश संदेश) हैं, और विभिन्न प्रोटोकॉल में विफल रहता है, साथ ही साथ दिल की धड़कन तंत्र भी है। सर्वर साइड पर क्लाइंट के लिए ID को और भी बहुत कुछ देता है। तो यह केवल एक आवरण नहीं है, यह पूर्ण विशेषताओं वाला पुस्तकालय है। वास्तव में हाल के वर्षों में इसका अच्छी तरह से समर्थन नहीं किया गया है, इसलिए मैं SockJS का उपयोग करने की सिफारिश करूंगा जो कि Socket.IO के लिए बेहतर और अधिक बनाए रखा गया विकल्प है।
मोका

4
@ मोका एक महीने पहले मैं आपसे सहमत होता। Socket.io 1.0 अभी बाहर है और इसे अपडेट मिल रहा है।
टिमोथी स्ट्रिम्पल

536

गलत धारणाएं

WebSocket और Socket.IO के बारे में कुछ सामान्य गलत धारणाएँ हैं:

  1. पहली ग़लतफ़हमी यह है कि सॉकेट.आईओ का उपयोग करना वेबसोकेट का उपयोग करने की तुलना में काफी आसान है जो ऐसा प्रतीत नहीं होता है। नीचे दिए गए उदाहरण देखें।

  2. दूसरी गलत धारणा यह है कि ब्राउज़र में WebSocket को व्यापक रूप से समर्थित नहीं किया गया है। अधिक जानकारी के लिए नीचे देखें।

  3. तीसरी गलतफहमी यह है कि सॉकेट.आईओ पुराने ब्राउज़र पर कमबैक के रूप में कनेक्शन को डाउनग्रेड करता है। यह वास्तव में मानता है कि ब्राउज़र पुराना है और सर्वर के लिए एक AJAX कनेक्शन शुरू करता है, जो बाद में कुछ ट्रैफ़िक का आदान-प्रदान होने के बाद WebSocket का समर्थन करने वाले ब्राउज़र पर अपग्रेड हो जाता है। जानकारी के लिए नीचे देखें।

मेरा प्रयोग

मैंने WebSocket और Socket.IO के बीच अंतर प्रदर्शित करने के लिए एक npm मॉड्यूल लिखा:

यह सर्वर-साइड और क्लाइंट-साइड कोड का एक सरल उदाहरण है - क्लाइंट वेबस्केट या सॉकेट.आईओ का उपयोग करके सर्वर से कनेक्ट होता है और सर्वर 1s अंतराल में तीन संदेश भेजता है, जो क्लाइंट द्वारा डोम में जोड़े जाते हैं।

सर्वर साइड

Express.js ऐप में भी ऐसा करने के लिए WebSocket और Socket.IO का उपयोग करने के सर्वर-साइड उदाहरण की तुलना करें:

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

सॉकेट.आईओ सर्वर

Express.js का उपयोग करके सॉकेट.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 क्लाइंट

वेनिला जावास्क्रिप्ट का उपयोग करते हुए 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

सॉकेट.आईओ क्लाइंट

वेनिला जावास्क्रिप्ट का उपयोग कर सॉकेट.आईओ ग्राहक उदाहरण:

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 केबी, 0.05 एस

उन 2 अनुरोधों में से:

  1. HTML पेज ही
  2. WebSocket में कनेक्शन अपग्रेड

(कनेक्शन अपग्रेड अनुरोध 101 स्विचिंग प्रोटोकॉल प्रतिक्रिया के साथ डेवलपर टूल पर दिखाई देता है।)

सॉकेट.आईओ परिणाम

6 अनुरोध, 181.56 केबी, 0.25 एस

उन 6 अनुरोधों में से:

  1. HTML पेज ही
  2. सॉकेट.आईओ का जावास्क्रिप्ट (180 किलोबाइट)
  3. AJAX के पहले लंबे मतदान का अनुरोध
  4. AJAX के दूसरे लंबे मतदान का अनुरोध
  5. तीसरे लंबे मतदान AJAX के अनुरोध
  6. WebSocket में कनेक्शन अपग्रेड

स्क्रीनशॉट

WebSocket परिणाम जो मुझे लोकलहोस्ट पर मिले:

WebSocket परिणाम - websocket-vs-socket.io मॉड्यूल

सॉकेट.आईओ परिणाम जो मुझे लोकलहोस्ट पर मिले:

सॉकेट.आईओ परिणाम - websocket-vs-socket.io मॉड्यूल

अपने आप का परीक्षण करें

जल्दी शुरू:

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

Open http: // localhost: 3001 / अपने ब्राउज़र में, Shift + Ctrl + I के साथ डेवलपर टूल खोलें, नेटवर्क टैब खोलें और वेबसर्केट संस्करण के लिए नेटवर्क ट्रैफ़िक देखने के लिए पृष्ठ को Ctrl + R के साथ पुनः लोड करें।

Open http: // localhost: 3002 / आपके ब्राउज़र में, Shift + Ctrl + I के साथ डेवलपर टूल खोलें, नेटवर्क टैब खोलें और Socket.IO संस्करण के लिए नेटवर्क ट्रैफ़िक देखने के लिए Ctrl + R के साथ पृष्ठ को फिर से लोड करें।

स्थापना रद्द करने के लिए:

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

ब्राउज़र संगतता

जून 2016 तक ओपेरा मिनी को छोड़कर सभी चीजों पर काम करता है।

यह जून 2016 के अनुसार CanS I का उपयोग करने पर WebSocket की ब्राउज़र संगतता है :

यहाँ छवि विवरण दर्ज करें

अप-टू-डेट जानकारी के लिए http://caniuse.com/websockets देखें ।


23
तो मूल रूप से आप जो कह रहे हैं, वह यह है कि websocket socket.io से बेहतर है?
जैक मोस्कोवी

42
@JackMoscovi मैं यह नहीं कहूंगा कि WebSocket जरूरी बेहतर है। यह सब आवश्यकताओं पर निर्भर करता है। WebSocket के फायदे हैं कि यह एक वेब मानक है (पहले W3C और whatwg के तहत, अब IETF के तहत, 5 साल पहले प्रकाशित RFC के साथ), यह बहुत हल्का है क्योंकि यह मूल रूप से ब्राउज़रों द्वारा समर्थित है, लेकिन अच्छा होने के दौरान ब्राउज़र सार्वभौमिक नहीं है। सॉकेट.आईओ अधिक ब्राउज़रों का समर्थन करता है और इसमें अधिक कार्यक्षमता है, लेकिन कुछ ओवरहेड के साथ भी आता है। कभी एक बेहतर होता है, तो कभी दूसरा। यह querySelectorAll और jQuery के बीच चयन करने जैसा है - इसका उत्तर हमेशा एक जैसा नहीं होता है
rsp

20
शानदार जवाब यहाँ !! यह मुझे सॉकेट के लिए लगता है। यह कई मामलों में आवश्यक नहीं है ... इस महान लेख को भी देखें! medium.com/@ivanderbyl/…
अल्वारो

4
@ मुझे नहीं लगता कि ये उदाहरण कार्यात्मक रूप से समतुल्य हैं? सॉकेट-आईओ बाधित होने पर ऑटो-पुन: कनेक्ट होने जैसी चीजों को संभालता है (जो मोबाइल उपकरणों पर होता है) और मुझे लगता है कि इसके आसपास सुरक्षा चिंताएं हैं जो आपके लिए नियंत्रित हैं? आपके सादे WS उदाहरण, जबकि कार्यात्मक रूप से समतुल्य, इन गुणों में नहीं हैं।
mindplay.dk

28
बहुत अच्छी तुलना। हालांकि, यह ध्यान देने योग्य है कि सॉकेट.आईओ कमरे का नाम रिक्ति, कनेक्शन विवरण के टन, लॉगिंग विवरण के बहुत सारे जोड़ता है, और सॉकेट के लिए बहुत सारे एकीकरण पुस्तकालय हैं। Angular, Vue, React और अन्य के साथ। सबसे महत्वपूर्ण बात यह है कि आप अजाक्स को लंबे समय तक मतदान में अक्षम कर सकते हैं और सीधे वेबस्केट के माध्यम से एक कच्चे WebSocket कनेक्शन की तरह कनेक्ट कर सकते हैं। इस तरह, आपको 180kb लाइब्रेरी के बराबर सब कुछ मिलता है। WebSocket का उपयोग करना सीधे तौर पर दर्दनाक है जब तक कि आपको नंगे न्यूनतम की आवश्यकता न हो। कमरे को गिरा देना और सामुदायिक आईपी तक पहुंच उद्यम के लिए चुनौतीपूर्ण है।
निक स्टील

30

Im सॉकेट का उपयोग करने के खिलाफ एक तर्क प्रदान करने जा रहा है।

मुझे लगता है कि सॉकेट का उपयोग करना। पूरी तरह से क्योंकि इसमें कमियां हैं, यह एक अच्छा विचार नहीं है। आईई 8 आरआईपी करें।

अतीत में ऐसे कई मामले सामने आए हैं जहां NodeJS के नए संस्करणों ने सॉकेट को तोड़ दिया है। आप इन सूचियों को उदाहरणों के लिए जाँच सकते हैं ... https://github.com/socketio/socket.io/issues?q=++or

यदि आप एक Android ऐप या ऐसी कोई चीज़ विकसित करने के लिए जाते हैं, जिसे आपके मौजूदा ऐप के साथ काम करने की ज़रूरत है, तो आप शायद WS के साथ काम करना ठीक होगा, socket.io आपको वहाँ कुछ परेशानी दे सकता है ...

इसके अलावा Node.JS के लिए WS मॉड्यूल उपयोग करने के लिए आश्चर्यजनक सरल है।


आप क्या सुझाव देते हैं कि हम mysql के साथ बातचीत करने के लिए उपयोग करते हैं -> express.js / fastify.js या node.js सीधे ... Android और ios चैट ऐप्स बनाने के लिए
DragonFire

25

सॉकेट.आईओ का उपयोग करना मूल रूप से jQuery का उपयोग करने जैसा है - आप पुराने ब्राउज़रों का समर्थन करना चाहते हैं, आपको कम कोड लिखने की आवश्यकता है और लाइब्रेरी कमियां प्रदान करेगी। सॉकेट.आईओ उपलब्ध होने पर वेबसोकेट्स तकनीक का उपयोग करता है, और यदि नहीं, तो उपलब्ध सर्वोत्तम संचार प्रकार की जांच करता है और इसका उपयोग करता है।


3

भले ही आधुनिक ब्राउज़र अब WebSockets का समर्थन करते हैं, मुझे लगता है कि सॉकेटियो को फेंकने की कोई आवश्यकता नहीं है और यह अभी भी किसी भी परियोजना में अपनी जगह रखता है। यह समझना आसान है, और व्यक्तिगत रूप से, मैंने सीखा कि वेबसॉकेट सॉकेटियो के लिए धन्यवाद कैसे काम करता है।

जैसा कि इस विषय में कहा गया है, Angular, React, आदि के लिए बहुत सारे एकीकरण पुस्तकालय हैं और टाइपस्क्रिप्ट और अन्य प्रोग्रामिंग भाषाओं के लिए परिभाषा प्रकार हैं।

अन्य बिंदु जो मैं सॉकेट.आईओ और वेबस्केट के बीच के अंतरों को जोड़ूंगा, वह यह है कि सॉकेट.आईओ के साथ क्लस्टरिंग एक बड़ी बात नहीं है। सॉकेट.आईओ एडेप्टर प्रदान करता है जिसका उपयोग इसे स्केल को बढ़ाने के लिए रेडिस के साथ जोड़ने के लिए किया जा सकता है। उदाहरण के लिए आपके पास आईओडिस और सॉकेट है

हां मुझे पता है, सॉकेट क्लस्टर मौजूद है, लेकिन यह ऑफ टॉपिक है।


2

Socket.IO WebSocket का उपयोग करता है और जब WebSocket उपलब्ध नहीं होता है, तो वास्तविक समय कनेक्शन बनाने के लिए फ़ॉलबैक एल्गो का उपयोग करता है।


0

https://socket.io/docs/#What-Socket-IO-is-not (मेरे जोर के साथ )

सॉकेट.आईओ क्या नहीं है

सॉकेट.आईओ वेबस्केट कार्यान्वयन नहीं है। हालाँकि Socket.IO वास्तव में जब संभव हो तो WebSocket को ट्रांसपोर्ट के रूप में उपयोग करता है, यह प्रत्येक पैकेट में कुछ मेटाडेटा जोड़ता है: पैकेट प्रकार, नाम स्थान और पैकेट आईडी जब एक संदेश पावती की आवश्यकता होती है। यही कारण है कि एक WebSocket क्लाइंट सफलतापूर्वक एक Socket.IO सर्वर से कनेक्ट नहीं हो पाएगा , और एक Socket.IO क्लाइंट किसी WebSocket सर्वर से कनेक्ट नहीं हो पाएगा । कृपया यहां प्रोटोकॉल विनिर्देश देखें ।

// WARNING: the client will NOT be able to connect!
const client = io('ws://echo.websocket.org');
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.