2016-12-11 32 views
0

我正在尋找一個非常基本的websocket示例服務器,它可以執行升級並從套接字讀取日期。目前我在我面前有RFC 6455,並且正在審閱它,但有興趣看看是否有一個簡單的示例/源項目,我可以看看。簡單和基本節點WebSocket客戶端和服務器示例

我目前一直在WS和Socket.io來源,但它們都有點密集

回答

1

也許這可以幫助別人尋找的WebSocket服務器的一個簡單的例子。這將只讀取126個字節,並充滿控制檯日誌,以瞭解發生了什麼。我通過RFC 6455文檔瞭解如何閱讀框架。

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

server.js [Node.js的v7.2.1]:

//Require Build In 
const http = require('http'); 
const fs = require('fs'); 
const crypto = require('crypto'); 

//My Consts 
const hostname = '127.0.0.1'; 
const port = 3000; 
const webSocketMagicString = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'; 

//Create Server 
const server = http.createServer((requestIncoming, responseOutGoing) => { 
    responseOutGoing.statusCode = 200; 
    responseOutGoing.setHeader('Contenet-Type', 'text/html'); 

    fs.readFile('index.html', function(error, content){ 
     responseOutGoing.end(content); 
    }); 


}); 

server.listen(port, hostname,() => { 
    console.log(`Server is online on http://${hostname}:${port}`); 
}); 

server.on('upgrade', (request, socket, head) => { 
    var secWebSocketKey = request.headers['sec-websocket-key'] + webSocketMagicString; 
    var hashedKey = crypto.createHash('SHA1').update(secWebSocketKey).digest('base64'); 

    //Send Back to requester 
    socket.write( 
      'HTTP/1.1 101 Switching Protocols\r\n' 
     + 'Upgrade: WebSocket\r\n' 
     + 'Connection : Upgrade\r\n' 
     + 'Sec-WebSocket-Accept:'+hashedKey+'\r\n' + '\r\n' 
    ); 


    //Start Keeping an Eye out for Data 
    socket.on('data', (data) => { 
     console.clear(); 
     console.log('Receiving Message:', data); 
     var isFinished = data[0] & 127; 
     var optionCode = data[0] & 15; 
     var isMasked = data[1] >> 7; 
     var dataLength = data[1] & 127; 
     console.log('Is Finished: ' + isFinished); 
     console.log('Is Masked: ' + isMasked); 
     console.log('Option Code: ' + optionCode); 
     console.log('Data Length: ' + dataLength); 
     if(optionCode === 1 && isFinished === 1 && isMasked === 1 && dataLength < 127){ 
      var maskingKey = data.slice(2, 6); 
      var maskedData = data.slice(6, 6+dataLength); 
      var unMaskedData = ''; 
      for(var i = 0; i < dataLength; i++){ 
       unMaskedData += String.fromCharCode(maskedData[i]^maskingKey[i % 4]); 
      } 
      console.log('unMaskedData: ' + unMaskedData); 
      echoTextMessage(socket, unMaskedData); 
     } 
    }); 
}); 

function echoTextMessage(socket, str){ 
    var response = [129, str.length]; 
    for(var i = 0; i < str.length; i ++){ 
     response.push(str.charCodeAt(i)); 
    } 
    console.log(response); 
    socket.write(new Buffer(response)); 
} 

index.html的

<script> 
    var ws = new WebSocket('ws://127.0.0.1:3000'); 
    ws.onopen = function(){ 
     console.log('Connected to 127.0.0.1:3000!'); 
    } 
    ws.addEventListener("message", function(event) { 
     console.log('Received: ' + event.data); 
    }); 

    sendMessage = (text = 'test') => { 
     console.log('Sent: ' + text) 
     ws.send(text); 
    } 
</script> 
相關問題