2015-09-27 29 views
7

Sto cercando di creare qualcosa come char usando node.js Sono novizio in nodejs e voglio crearlo senza socket.io (voglio imparare come funziona). Ecco il codice che sto usando.nodo js prese di rete + web socket senza 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); 

E tutto funziona bene, (penso). Quando sono aperto localhost: 7000 sto ricevendo messaggi di nodo CMD su "CONNECTED TO:" e "connected" e "I am Chack Norris". Dopo di che sto cercando di scrittura nella console del browser:

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

Inoltre nessun errore, ma quando sto cercando questa linea:

conn.send('lol'); 

sto ottenendo l'errore: "DOMException Uncaught: Failed per eseguire "invia" su "WebSocket": ancora in stato CONNESSIONE. (...) "

E dopo un po 'di tempo ricevo un altro errore:" Connessione WebSocket a "ws: // localhost: 7001 /" non riuscita : Scaduto l'handshake di apertura WebSocket "

forse questo codice è sbagliato, ma ho provato tutto ciò che ho trovato gettare il google. Qualcuno può aiutarmi con questo?

+0

Il protocollo WebSocket è molto più complicato della semplice apertura di una porta. Devi implementare l'handshake e il framing sul lato server se vuoi che funzioni. Controlla la libreria 'ws', forse. –

risposta

8

Se si desidera creare il proprio server webSocket in grado di ricevere connessioni webSocket dal browser, sarà necessario implementare il protocollo webSocket sul server. Non è solo una semplice connessione socket. Ha una sequenza di avvio che inizia come una connessione HTTP che viene poi "aggiornata" al protocollo webSocket, incluso uno scambio di informazioni sulla sicurezza e poi c'è un formato di frame webSocket per tutti i dati inviati tramite webSocket. Non si invia solo testo normale su una webSocket.

È possibile visualizzare l'aspetto del protocollo webSocket qui: Writing Websocket Servers. A meno che tu non voglia veramente creare il tuo server webSocket solo per scopi di apprendimento, ti suggerirei davvero di ottenere un modulo esistente che ha fatto tutto il protocollo Nitty gritty per te.

La libreria socket.io viene quindi creata sopra il protocollo webSocket, aggiungendo funzionalità aggiuntive e formato di messaggio.

Per dare un'idea di come un websocket collega, ecco una tipica sequenza di connessione:

browser invia la connessione richiesta:

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

Server risponde:

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

Poi, entrambe le parti passare al protocollo webSocket che ha un formato di frame di dati come questo:

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

Quindi, ci sono anche pacchetti ping e pong per i test keep-alive e c'è uno schema per pacchetti di grandi dimensioni e frammentazione e client/server può negoziare un sottoprotocollo.

+0

Grazie! È stato molto utile! –

+0

Grazie @ jfriend00, ho trascorso molto tempo tra il modulo nodejs net e l'aggiornamento http per evitare l'utilizzo di librerie di terze parti, la tua risposta mi sta convincendo a smettere ora e iniziare a usare la libreria socket pronta, grazie. –