सॉकेट कनेक्शन पर अतिरिक्त डेटा भेजें


80

सॉकेट कनेक्शन पर अतिरिक्त डेटा कैसे भेजें?

ग्राहक:

socket.on('connect',function(){ 
//I'd like set some values and pass them up to the node server.
});

Node.js सर्वर:

io.on('connection', function(client){
//I'd like to get the data here.
});

उदाहरण के लिए उपयोगकर्ता का नाम या ईमेल पता आदि भेजना।

जवाबों:


66

आपको अपना डेटा या तो कनेक्ट करने या बनाने पर भेजना चाहिए:

var s = io('http://216.157.91.131:8080/', { query: "foo=bar" });
s.connect();

var c = io.connect('http://216.157.91.131:8080/', { query: "foo=bar" });

सॉकेट के नए संस्करण के साथ। सर्वर, जहां चीजें बदल दी गई हैं:

var io = require('socket.io')(server);

io.use(function(socket, next) {
  var handshakeData = socket.request;
  console.log("middleware:", handshakeData._query['foo']);
  next();
});

मैंने देखा है कि अन्य लोग उपयोग करने के लिए कहते हैं socket.request.query, लेकिन यह मेरे लिए सॉकेट पर काम नहीं करता है। v1.7.2। निश्चित रूप से उपयोग करना है socket.request._query
kellen

इस पर कोई दस्तावेज क्यों नहीं है? github.com/socketio/socket.io-client/blob/master/docs/…
rocketspacer

4
सॉकेट.आईओ v1.7.3 के लिए, मुझे इसका उपयोग करना पड़ा socket.handshake.query( इस उत्तर के माध्यम से )।
गैलन लॉन्ग

एक से अधिक पैरामीटर भेजने का कोई तरीका नहीं? क्या कोई वाक्यविन्यास जानता है? फॉक्स छूट { query: "foo=bar", "bar=foo" }काम नहीं करेगा।
Adry

1
@Miquel का उपयोग कर हल{query: 'var1='+foo+'&var2=bar'
Adry

32

मेरे पास एक अलग दृष्टिकोण है - डेटा के साथ जुड़ने के ठीक बाद एक घटना का उत्सर्जन करें:

socket.on('connect',function(){ 
    // Send ehlo event right after connect:
    socket.emit('ehlo', data);
});

io.on('connection', function(client){
    // Receive ehlo event with data:
    client.on('ehlo', function(data) {
    });
});

आप एक चर / वस्तु पकड़ सकते हैं, और कह सकते हैं, जब ehloडेटा के साथ कोई घटना नहीं होती है , तो अन्य घटनाओं को तब तक अनदेखा किया जाता है जब तक ehloकि भेजा नहीं जाता है।

यदि यह संतुष्ट नहीं करता है, तो कनेक्ट करते समय आप डेटा भेज सकते हैं, मैं कोड की प्रतिलिपि नहीं बनाऊंगा लेकिन यह इस उत्तर में है: https://stackoverflow.com/a/13940399/1948292


6
यह एक टोकन की तरह उपयोगकर्ता की पहचान करने के लिए डेटा पास करने के लिए एक अच्छा तरीका है। तुम भी संभाल करने के लिए चाहते हो सकता है socket.on('reconnect', …)आपके सर्वर डेटा यह एक डिस्कनेक्ट के बाद बने बंद हो सकता है की जरूरत है।
इयान कॉलिंस

15

connectionजैसे ही टीसीपी कनेक्शन स्थापित होता है , घटनाओं को निकाल दिया जाता है। बीच में कुछ भेजने का कोई तरीका नहीं है।

आप जो कुछ भी कर सकते हैं वह केवल सर्वर द्वारा भेजे गए पहले संदेश को ले जाना और उस संदेश में डेटा डालना है। मैं दृढ़ता से इसके लिए कुछ पतले प्रोटोकॉल को रोल करने का सुझाव दूंगा, इसलिए आपके पास कई प्रकार के संदेश होंगे और यह निर्धारित करने के लिए कि कोड को डेटा को कैसे संसाधित करना है, का उपयोग करना चाहिए।

यह अधिक विस्तार योग्य होगा, क्योंकि इसके लिए एक सामान्य वास्तुकला के साथ आना काफी आसान है। यदि आप userdataपहले आने के लिए इंतजार करना चाहते हैं तो आप बस अपने कनेक्शन में कुछ राज्य जोड़ सकते हैं।


हे इवो, मुझे वापस पाने के लिए बहुत बहुत धन्यवाद। क्या आप मुझे बता सकते हैं कि आप जो कह रहे हैं उसे कैसे हासिल किया जा सकता है? एक बार फिर धन्यवाद!
दान

असल में, मेरे पास एक काम करने वाला चैट ऐप है, जहां आप विशिष्ट ग्राहकों को भेज सकते हैं। मुद्दा यह है कि मेरे पास उपयोगकर्ता नाम के साथ सेशन का मिलान करने का कोई तरीका नहीं है। इसलिए, अगर आप और मैं "डैन" और "इवो" कहने के बजाय चैट कर रहे थे, तो यह क्लाइंट आईडी दिखाएगा।
दान

क्या आप मुझे अपने आर्किटेक्चर / कोड के बारे में कुछ और जानकारी दे सकते हैं? आईडी कहां से आती हैं और नाम कहां से आते हैं? क्या ऐप केवल सर्वर से अनुरोध नहीं कर सकता और आईडी के साथ जुड़े उपयोगकर्ता नाम के लिए पूछ सकता है?
इवो ​​वेटजेल

उपयोगकर्ता नाम db (यानी उपयोगकर्ता लॉग्स के बाद) से आएगा। id क्लाइंट से आते हैं। SessionId। ईमानदार होने के लिए, मैंने एक समान प्रश्न के लिए दिए गए उत्तर के आधार पर अपना समाधान लागू किया। मैं क्लाइंट्स को ऐड (ऑन कनेक्ट) में एक ऐरे में जोड़ता हूं और डिस्कनेक्ट पर उन्हें हटा देता हूं। मैं क्लाइंट आईडी को संदेश और कनेक्ट पर क्लाइंट को पास करता हूं। यह वास्तव में अच्छी तरह से काम कर रहा है, इसलिए उस अन्य पोस्ट के लिए बहुत बहुत धन्यवाद :) तो, क्या आप कह रहे हैं कि मुझे db को कॉल करना चाहिए और db में एक फ़ील्ड में सेशन से मेल खाने का प्रयास करना चाहिए?
दान

@Dan: बस अपने उपयोगकर्ता सत्र को Redis में संग्रहीत करें और उपयोगकर्ता ब्राउज़र में कुकी में संग्रहीत कुंजी रखें। सॉकेट कनेक्ट पर कुकी प्राप्त करें और इसे सर्वर पर वापस भेजें।
श्रीपाद कृष्ण

8

यह डेटा को नोडज और सर्वर.io सर्वर क्लाइंट को क्वेरी भेजने के लिए मेरा कोड है

var socket = io.connect(window.location.origin,{query:'loggeduser=user1'});

io.sockets.on('connection', function (socket) {
    var endp = socket.manager.handshaken[socket.id].address;
    console.log("query... " +  socket.manager.handshaken[socket.id].query.user);
});

क्वेरी ... उपयोगकर्ता 1


5

मुझे यहाँ पर स्थित उत्तर वास्तव में इस संबंध में मददगार लगा: कस्टम डेटा के साथ साथ socket.io में handshakeData भेजें?

निम्नलिखित प्रलेखन पर ब्रश करने से हैंडशेक ऑब्जेक्ट के लिए चर को टाई करने के तरीकों की व्याख्या करने में मदद मिलती है, जिसे कनेक्शन के दौरान सॉकेट ऑब्जेक्ट से एक्सेस किया जा सकता है: https://github.com/LearnBoost/socket.io/wiki/Anhorizing#global-authorization


2

यह सॉकेट संस्करण 2.1.1 पर मेरा कोड है

//client side
var socket = io.connect(window.location.origin,{query:'loggeduser=user1'});

// server side
io.socket.on('connection', function (socket) {
    console.log("loggeduser => " +  socket.handshake.query.loggeduser);
});

0

मैं मान रहा हूँ कि आप एसएसएल का उपयोग करेंगे।

संवेदनशील डेटा भेजने के लिए querystrings का उपयोग करना एक अच्छा सुरक्षा अभ्यास नहीं है ( क्यों? )। मुझे लगता है कि यदि आपको गैर-संवेदनशील डेटा भेजने की आवश्यकता है, तो मिकेल उत्तर सबसे तेज़ और अधिक आसान है, लेकिन यदि संवेदनशील डेटा वह है जिसे आपको भेजने की आवश्यकता है, तो डैनियल डब्ल्यू जैसा कुछ लेना सबसे अच्छा तरीका है।

प्रमाणीकरण दृष्टिकोण के लिए, आप इस गितुब परियोजना ( सॉकेटियो-ऑक्टोर ) पर एक नज़र डाल सकते हैं , जो इस तथ्य से परे है कि यह वर्तमान में बिना रखरखाव के साथ है, आपको समस्या से निपटने के तरीके का एक अच्छा विचार दे सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.