2011-08-22 60 views
1

我必須丟失一些非常明顯的東西,但是我無法正常工作。Node.js WebSocket服務器無法從Chrome中接收到正確的數據

握手過程正常,但只要我發送一段數據,我就不會在服務器上得到正確的數據。

服務器:

stream.on("data", function(data) { 
    if(!handshake) return doHandshake(); // no problems with handshake 
    console.log(data); 
}); 

客戶:

ws = new WebSocket("ws://localhost:12345"); 
ws.onopen = function() { 
    ws.send(String.fromCharCode(parseInt("89", 16))); 
} 

我看到node.js的控制檯什麼:

<Buffer 81 82 ed 68 ae 67 2f e1> 

所以關鍵是ed 68 ae 67編碼,並將編碼數據2f e1。使用異或解碼解碼數據似乎是c2 89。 A c2由於某些未知原因而被預先考慮 - 89是正確的。

奇怪的事情發生了與其他字符,也:

ws.send(String.fromCharCode(parseInt("ab", 16))); 

我得到:

<Buffer 81 82 ff 8e 45 34 3d 25> 

,解碼數據c2 ab而不是ab

我使用新的成幀格式(Chrome 15)和Windows版本的節點(node.exe)。

  • 這裏怎麼回事?
  • 是否可以查看Chrome發送的內容,以便了解問題出在哪裏?

回答

4

嘗試使用Chrome 13(當前穩定通道)。

Chrome 14+使用Web Sockets規範的newer version,它可能不會在您的版本節點websocket服務器中實現。

欲瞭解更多信息,請參閱規格的old versionhttp://chromestatus.com。此外,當前版本的Chrome甚至是那些實現新規範(目前爲Chrome 14和15)的Chrome都不允許發送二進制數據。

+2

不,hixie-76不工作(握手已失敗)。我正在使用新的hybi-10握手,所以實際上我*必須使用Chrome 15. – pimvdb

+0

現在我看看http://chromestatus.com,我看到它聲明'm15:二進制消息API(已計劃) '。這是否意味着我現在只能發送'普通'字符而不是任意字符? – pimvdb

+2

您是否實現了自己的服務器?看起來您正在使用基於'stream.on()'調用的socket.io。是的,現在你只能發送文本數據,沒有二進制數據。 –

1

事實證明,它將所有內容都轉換爲UTF-8格式。

根據Wikipedia,127和2047(基體10)之間的所有內容將被編碼爲兩個字節:

110bbbaa 10aaaaaa 

對於例如89

base 16 - 89 
base 10 - 137 
base 2 - 10001001 so bbb = 000, aaaaaaaa = 10001001 

它以10爲底數超過127。因此,將編碼爲:

110bbbaa 10aaaaaa 
11000010 10001001 

這是基地16:

c2 89 

挫敗它,但至少我現在知道問題出在哪裏?

1

我m在MacOS X上使用Chrome 14.0.835.186。剛剛由於Chrome瀏覽器中的WebSocket更改而導致我的應用程序出現問題。

我切換到: https://github.com/Worlize/WebSocket-Node

正如作者說:

警告:這是隻實現WebSocket協議的最新草案庫。直到發佈支持它的新版本之後,它才能與製作瀏覽器一起使用。

這是一個內部應用程序,所以我有迫使人們使用Chrome 14的豪華,但有一個黑客支持其他草稿https://gist.github.com/1219165。我也只使用純文本。

相關問題