2012-12-09 28 views
11

मैं उसी पोर्ट पर tcp, http और websocket.io संचार सक्षम करने की कोशिश कर रहा हूं। मैंने टीसीपी सर्वर (ऊपर //// लाइन से ऊपर) के साथ शुरुआत की, यह काम किया। तब मैंने echo server example found on websocket.io (नीचे //// लाइन नीचे भाग) चलाया, यह भी काम किया। लेकिन जब मैं उन्हें एक साथ विलय करने की कोशिश करता हूं, तो टीसीपी अब और काम नहीं करता है।क्या एक ही बंदरगाह का उपयोग कर टीसीपी, http और websocket सभी को सक्षम करना संभव है?

SO, क्या यह एक ही बंदरगाह का उपयोग कर टीसीपी, http और websockets को सक्षम करना संभव है? या मुझे टीसीपी कनेक्शन के लिए एक और बंदरगाह पर सुनना है?

var net = require('net'); 
var http = require('http'); 
var wsio = require('websocket.io'); 

var conn = []; 

var server = net.createServer(function(client) {//'connection' listener 
    var info = { 
     remote : client.remoteAddress + ':' + client.remotePort 
    }; 
    var i = conn.push(info) - 1; 
    console.log('[conn] ' + conn[i].remote); 

    client.on('end', function() { 
     console.log('[disc] ' + conn[i].remote); 
    }); 

    client.on('data', function(msg) { 
     console.log('[data] ' + conn[i].remote + ' ' + msg.toString()); 
    }); 

    client.write('hello\r\n'); 
}); 

server.listen(8080); 

/////////////////////////////////////////////////////////// 

var hs = http.createServer(function(req, res) { 
    res.writeHead(200, { 
     'Content-Type' : 'text/html' 
    }); 
    res.end(['<script>', "var ws = new WebSocket('ws://127.0.0.1:8080');", 'ws.onmessage = function (data) { ws.send(data); };', '</script>'].join('')); 
}); 

hs.listen(server); 

var ws = wsio.attach(hs); 
var i = 0, last; 

ws.on('connection', function(client) { 

    var id = ++i, last 

    console.log('Client %d connected', id); 

    function ping() { 
     client.send('ping!'); 
     if (last) 
      console.log('Latency for client %d: %d ', id, Date.now() - last); 
     last = Date.now(); 
    }; 

    ping(); 
    client.on('message', ping); 

}); 
+1

HTTP आम तौर पर टीसीपी के शीर्ष पर चलता है websockify बनाया है। HTTP और टीसीपी द्वारा आपका क्या मतलब है? –

+0

यही कारण है कि मुझे संदेह है। मेरे सर्वर को मोबाइल ऐप्स के माध्यम से ब्राउज़र और टीसीपी कनेक्शन के माध्यम से websockets के साथ संवाद करने की आवश्यकता है। इस प्रकार मुझे दोनों प्रोटोकॉल की आवश्यकता है। –

+0

शायद आप कच्चे टीसीपी के रूप में सुन सकते हैं और यदि आप HTTP का पता लगाते हैं, तो दूसरे हैंडलर को मैन्युअल रूप से अग्रेषित करें। इसी प्रकार, यदि आप HTTP सर्वर से WS का पता लगाते हैं (WS HTTP के रूप में प्रारंभ होता है), फिर से प्रतिनिधि दें। –

उत्तर

22

आप एक ही बंदरगाह द्वारा नियंत्रित सी अलग-अलग प्रोटोकॉल हो सकता है लेकिन कुछ चेतावनियां हैं:

  • सर्वर का पता लगाने (या बातचीत) प्रोटोकॉल है कि ग्राहक बात करने की इच्छा के लिए किसी तरह का होना चाहिए । आप प्रोटोकॉल का पता लगाने के सामान्य तरीके के रूप में अलग-अलग बंदरगाहों के बारे में सोच सकते हैं, जो क्लाइंट बोलना चाहता है।

  • वास्तव में केवल एक सर्वर प्रक्रिया बंदरगाह पर सुन सकती है। यह सर्वर केवल प्रोटोकॉल के प्रकार का पता लगाने और फिर कई अन्य सर्वरों को अग्रेषित करने के उद्देश्य को पूरा कर सकता है, लेकिन प्रत्येक पोर्ट का एक सर्वर प्रक्रिया है।

  • आप एकाधिक प्रोटोकॉल का समर्थन नहीं कर सकते हैं जहां सर्वर पहले बोलता है (क्योंकि क्लाइंट के प्रोटोकॉल का पता लगाने का कोई तरीका नहीं है)। आप एकाधिक क्लाइंट-प्रथम प्रोटोकॉल के साथ एक सर्वर-पहले प्रोटोकॉल का समर्थन कर सकते हैं (क्लाइंट डेटा भेजने के लिए स्वीकार करने के बाद स्वीकार करने के बाद एक छोटी देरी जोड़कर), लेकिन यह थोड़ा सा भद्दा है।

वेबसॉकेट प्रोटोकॉल का एक स्पष्ट डिज़ाइन लक्ष्य वेब सर्वर और HTTP प्रोटोकॉल को एक ही सर्वर पोर्ट साझा करने की अनुमति देना था। प्रारंभिक वेबसॉकेट हैंडशेक एक HTTP संगत अपग्रेड अनुरोध है। HTTP, HTTPS (एन्क्रिप्टेड HTTP), WS (WebSockets), WSS (एन्क्रिप्टेड WebSockets), और फ्लैश नीति प्रतिक्रिया:

websockify सर्वर/पुल एक सर्वर है कि एक ही बंदरगाह पर 5 अलग अलग प्रोटोकॉल बात कर सकते हैं का एक उदाहरण है। यह सर्वर यह निर्धारित करने के लिए आने वाले अनुरोध के पहले चरित्र पर चोटी करता है कि यह टीएलएस एन्क्रिप्टेड (HTTPS, या WSS) है या फिर यह "<" (फ़्लैश नीति अनुरोध) से शुरू होता है या नहीं। यदि यह फ़्लैश नीति अनुरोध है, तो यह अनुरोध को पढ़ता है, प्रतिक्रिया देता है और कनेक्शन बंद करता है। अन्यथा, यह HTTP हैंडशेक (या तो एन्क्रिप्टेड या नहीं) पढ़ता है और कनेक्शन और अपग्रेड हेडर निर्धारित करते हैं कि यह एक वेबसाकेट अनुरोध है या एक सादा HTTP अनुरोध है।

अस्वीकरण: मैं

+0

@kanaka: कितने ग्राहक एक बंदरगाह से कनेक्ट हो सकते हैं? मैं जानना चाहता हूं कि एक समय में जावा वेब ऐप कितने वेब सॉकेट कनेक्शन संभाल सकता है? क्लाइंट से प्रत्येक वेब सॉकेट अनुरोध पर हमें सर्वर पर एक diff पोर्ट की आवश्यकता है? –

+1

@DaxJoshi जो एक अलग प्रश्न के रूप में बेहतर संभव है। यह वास्तव में Websockets के साथ कुछ भी करने की ज़रूरत नहीं है। सर्वर पोर्ट जहां टीसीपी कनेक्शन _accepted_ हैं, बहुत सारे कनेक्शन संभाल सकते हैं। आप प्रत्येक ग्राहक के लिए एक अलग सर्वर पोर्ट नहीं है। Websockify मामले में, यदि आप विभिन्न ग्राहकों को websockify के माध्यम से विभिन्न लक्ष्यों से कनेक्ट करना चाहते हैं, तो आपको [टोकनफाइल प्लगइन/लक्ष्य कॉन्फ़िगरेशन] (https://github.com/kanaka/websockify/wiki/Token- आधारित) देखना चाहिए - लक्ष्य-चयन) websockify की कार्यक्षमता। – kanaka

1

संक्षिप्त उत्तर - नहीं, आपके पास एक ही बंदरगाह पर चल रहे विभिन्न टीसीपी/HTTP/Websocket सर्वर नहीं हो सकते हैं।

लांगिश उत्तर - टीसीपी के शीर्ष पर दोनों websockets और HTTP कार्य। तो आप कस्टम सर्वर टीसीपी सर्वर (कुछ राज्य एमजीएमटी और प्रोटोकॉल विशिष्ट एन्कोडिंग/डिकोडिंग के साथ) के रूप में एक http सर्वर या websocket सर्वर के बारे में सोच सकते हैं। एक मशीन पर एक ही बंदरगाह/प्रोटोकॉल जोड़ी से कई सॉकेट बांधना संभव नहीं है और इसलिए पहला जीत जाएगा और निम्न को सॉकेट बाइंड अपवाद मिलेगा।