2015-09-27 9 views
7

के बिना WebSocket मैं चार का उपयोग कर Node.js मैं NodeJS में नौसिखिया हूँ की तरह कुछ बनाने का प्रयास करते हैं और मैं (मैं जानने के लिए यह कैसे काम करता चाहते हैं) socket.io बिना यह बनाना चाहते हैं। यहां कोड है जिसका मैं उपयोग कर रहा हूं।नोड js शुद्ध सॉकेट + socket.io

var http = require('http'); 
var net = require('net'); 


var server = http.createServer(function(req,res){ 

    res.writeHead(200,{'content-type' : 'text/html'}); 
    res.write('<a href="./lol/">lol</a><br>'); 
    res.end('hello world: '+req.url); 



    var client = new net.Socket(); 
    client.connect('7001', '127.0.0.1', function() { 

     console.log('CONNECTED TO: '); 
     // Write a message to the socket as soon as the client is connected, the server will receive it as message from the client 
     client.write('I am Chuck Norris!'); 

    }); 

    // Add a 'data' event handler for the client socket 
    // data is what the server sent to this socket 
    client.on('data', function(data) { 

     console.log('DATA: ' + data); 
     // Close the client socket completely 
     client.destroy(); 

    }); 

    // Add a 'close' event handler for the client socket 
    client.on('close', function() { 
     console.log('Connection closed'); 
    }); 
    //req. 

}); 
server.listen(7000); 


require('net').createServer(function (socket) { 
    console.log("connected"); 

    socket.on('data', function (data) { 
     console.log(data.toString()); 
    }); 
}).listen(7001); 

और सभी ठीक काम करते हैं, (मुझे लगता है)। जब मैं स्थानीयहोस्ट खोलता हूं: 7000 मैं नोड सीएमडी संदेशों में "कनेक्ट किए गए" और "कनेक्ट" और "मैं चाक नॉरिस" के बारे में नोड सीएमडी संदेशों में शामिल हूं। उसके बाद मैं ब्राउज़र कंसोल में लिखने कोशिश कर रहा हूँ:

var conn = new WebSocket('ws://localhost:7001/'); 

इसके अलावा कोई त्रुटि है, लेकिन जब मैं इस लाइन कोशिश कर रहा हूँ: "Uncaught DOMException:

conn.send('lol'); 

मैं त्रुटि मिल रही है विफल 'वेबस्केट' पर 'प्रेषण' निष्पादित करने के लिए: अभी भी कनेक्टिंग स्थिति में। (...) "

और कुछ समय बाद मुझे एक और त्रुटि मिल रही है:" वेबसॉकेट कनेक्शन 'ws: // localhost: 7001 /' विफल : वेबस्केट ओपनिंग हैंडशेक का समय समाप्त हो गया "

शायद यह कोड गलत है, लेकिन मैंने Google को फेंकने वाली हर चीज को आजमाया है। क्या कोई इस में मेरी मदद कर सकता है?

+0

वेबसॉकेट प्रोटोकॉल बस एक बंदरगाह खोलने से कहीं अधिक जटिल है। यदि आप इसे काम करना चाहते हैं तो आपको सर्वर साइड पर हैंडशेक और फ़्रेमिंग लागू करना होगा। शायद 'ws' लाइब्रेरी देखें। –

उत्तर

8

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

आप देख सकते हैं कि वेबसाकेट प्रोटोकॉल यहां कैसा दिखता है: Writing Websocket Servers। जब तक कि आप वास्तव में सीखने के उद्देश्यों के लिए अपना स्वयं का वेबस्केट सर्वर बनाना नहीं चाहते हैं, तो मैं वास्तव में सुझाव देता हूं कि आपको एक मौजूदा मॉड्यूल प्राप्त हो जिसने आपके लिए सभी नट किरकिरा प्रोटोकॉल काम किया है।

सॉकेट.ओ लाइब्रेरी को वेबसाकेट प्रोटोकॉल के शीर्ष पर बनाया गया है, इसके अतिरिक्त अतिरिक्त सुविधाएं और संदेश प्रारूप जोड़ना।

GET /chat HTTP/1.1 
Host: example.com:8000 
Upgrade: websocket 
Connection: Upgrade 
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== 
Sec-WebSocket-Version: 13 

सर्वर से प्रतिक्रिया करता है:

HTTP/1.1 101 Switching Protocols 
Upgrade: websocket 
Connection: Upgrade 
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= 

फिर, दोनों पक्षों

ब्राउज़र अनुरोध कनेक्ट भेजता है:

आप इसका अंदाज़ा लगा एक WebSocket जोड़ता है देने के लिए, यहाँ एक ठेठ कनेक्शन अनुक्रम है वेब सॉकेट प्रोटोकॉल पर स्विच करें जिसमें डेटा फ्रेमिंग प्रारूप है:

0     1     2     3 
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
+-+-+-+-+-------+-+-------------+-------------------------------+ 
|F|R|R|R| opcode|M| Payload len | Extended payload length | 
|I|S|S|S| (4) |A|  (7)  |    (16/64)   | 
|N|V|V|V|  |S|    | (if payload len==126/127) | 
| |1|2|3|  |K|    |        | 
+-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - + 
|  Extended payload length continued, if payload len == 127 | 
+ - - - - - - - - - - - - - - - +-------------------------------+ 
|        |Masking-key, if MASK set to 1 | 
+-------------------------------+-------------------------------+ 
| Masking-key (continued)  |   Payload Data   | 
+-------------------------------- - - - - - - - - - - - - - - - + 
:      Payload Data continued ...    : 
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + 
|      Payload Data continued ...    | 
+---------------------------------------------------------------+ 

फिर, इसके अलावा, जीवित परीक्षणों के लिए पिंग और पोंग पैकेट हैं और बड़े पैकेट और विखंडन और क्लाइंट/सर्वर के लिए एक योजना एक सब-प्रोटोकॉल पर बातचीत कर सकती है।

+0

धन्यवाद! वह बहुत उपयोगी था! –

+0

धन्यवाद @ jfriend00, मैंने तृतीय पक्ष पुस्तकालयों का उपयोग करने से बचने के लिए नोडजेस नेट मॉड्यूल और http अपग्रेड के बीच अधिक समय बिताया, आप जवाब देने के लिए मुझे विश्वास दिला रहे हैं, और तैयार सॉकेट लाइब्रेरी का उपयोग करना शुरू करें, धन्यवाद। –

संबंधित मुद्दे