2011-11-19 79 views
1

我想在node.js中設置一個websocket服務器,但有問題。我發現了一個位碼在這裏計算器和繼承人的servercode我現在有:Chrome 16 websocket二進制

var net = require("net"), crypto = require("crypto"), users = []; 

net.createServer(function(socket) { 
    this.name = "Anonymous"; 
    users.push(socket);  

    socket.on('data', function(buffer) { 
     if(buffer.toString('utf-8').substring(0, 14) === "GET/HTTP/1.1") { 
      this.securyPattern = /Sec-WebSocket-Key: (.*)/g; 
      this.key = this.securyPattern.exec(buffer); 
      this.magic = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; 
      this.sha1 = crypto.createHash("sha1"); 
      this.sha1.update(this.key[1] + this.magic); 
      this.accept = this.sha1.digest("base64"); 
      socket.write("HTTP/1.1 101 Switching Protocols\r\nUpgrade: WebSocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: " + this.accept + "\r\n\r\n"); 
     } else { 
      console.log(buffer); 
      console.log(buffer.toString('utf-8')); 
     } 
    }); 

    socket.on('end', function() { 
     users.splice(users.indexOf(socket), 1); 
    }); 
}).listen(1337); 

一切工作正常,因爲它連接,並且當這種情況發生,當有人斷開users.length被更新。

問題是我不知道如何讀取除頭(這是純文本)以外的消息,所以我必須打印緩衝區和buffer.toString('utf-8')的行只打印二進制不同所有的時間,例如,對於單詞 「hello」:

<Buffer 81 85 71 dc c1 02 19 b9 ad 6e 1e> 
??q??☻↓??n▲ 
<Buffer 81 85 8e 8f 0f a2 e6 ea 63 ce e1> 
????☼???c?? 

我用發送此 「你好」 使用Chrome 16: myWebSocket.send( 「你好」); myWebSocket是WebSocket對象。

那麼我該如何讀寫消息到這個套接字呢?

+0

不要嘗試自己做。使用socket.io,它在服務器和瀏覽器之間的實時消息傳遞以及很多後備(flashsockets,長輪詢等)方面具有很好的API,以防瀏覽器太笨。 – thejh

+0

我一直在尋找如何使用,但我無法找到下載鏈接,我想我發現它不適用於Windows,你知道它是否是? –

+0

它應該在windows上工作。你應該用npm來安裝它。 – thejh

回答

2

請注意,在握手之後,數據在每幀的開始處以2個或更多標題字節組成框架。另外請注意,從客戶端(瀏覽器)發送到服務器的有效負載使用簡單的4字節運行XOR掩碼進行屏蔽。

取景定義是不是實現自己的WebSocket服務器節點可以考慮使用一個更高層次的抽象像Socket.IOdefined in section 5 of the spec

1

這是我在處理該緩衝區代碼:

socket.ondata = function(src,start,end) { 
    src = src.slice(start,end); 
    var maskKeys = [src[2],src[3],src[4],src[5]]; 
    var dest = new Array(); 
    for(var i=0;i<src.length-6;i++){ 
     var mKey = maskKeys[i%4]; 
     dest[i] = mKey^src[6+i]; 
    } 
    console.log(new Buffer(dest).toString()); 
} 

從這裏找到:http://songpengfei.iteye.com/blog/1178310