2012-02-11 65 views
0

的WebSocket上的客戶端:的WebSocket數據解析與Node.js的

socket.send('helloworld'); 

的WebSocket上的Node.js:

socket.ondata = function(d, start, end){ 
    // I suppose that the start and end indicates the location of the 
    // actual data 'hello world' after the headers 
    var data = d.toString('utf8', start, end); 

    // Then I'm just printing it 
    console.log(data); 
}); 

,但我發現這一點:�����]���1���/��在終端上:o

我試圖理解這個文檔:http://tools.ietf.org/html/rfc6455#section-5.2但很難理解,因爲我不知道我應該怎麼用,我的意思是,我不能看到這些數據,即使toString工作?

我試圖關注和測試這個問題的答案How can I send and receive WebSocket messages on the server side?,但我不能得到它的工作,與這個答案我得到這樣一個數組[false,true,false,false,true,true,false ]等等...我真的不知道該怎麼做..:\

所以我有點糊塗了,到底我應該做的,我從客戶端得到數據獲得後真正的信息?

我使用原來的客戶端和Node.js的API沒有任何庫。

+0

'我正在使用原始客戶端和node.js API,而沒有任何庫.'爲什麼不使用'socket.io'庫? – pkyeck 2012-02-11 08:56:51

+3

@pkyeck因爲我想了解websockets是如何工作的:),我對socket.io沒有任何問題,我已經用它很酷,但是我想要更深入的類型:) – Adam 2012-02-11 16:46:59

回答

1

其中Node.js的庫您使用?根據您正在掛接類似於HTTP服務器API的socket.ondata來判斷。 WebSockets不是HTTP。它具有HTTP兼容的握手,因此WebSocket和HTTP服務可以位於相同的端口上,但這就是相似性結束的地方。握手之後,WebSockets是一種幀格式的全雙工,長期的消息傳輸,與普通的TCP套接字類似,而不像HTTP。

如果你想實現你會希望直接使用套接字庫的node.js自己的WebSocket服務器(或鞏固/借用現有的WebSocket服務器代碼)。

這是一個基於Node.js的WebSocket服務器,它從WebSocket橋接到TCP套接字:https://github.com/kanaka/websockify/blob/master/other/websockify.js請注意,它適用於協議的前一個Hixie版本(我還沒有機會或動機來更新它)。該協議的現代HyBI版本是非常不同的,但你可能能夠從該實現中收集一些有用的信息。

+0

謝謝非常重要的是你的回答,因爲我說我不使用任何外部庫,只是原始的API,'socket.ondata'來自HTTP更新事件,'server.on('update',function(request,socket ,head){socket.ondata ...})'。我的問題是,我無法看到數據,因爲它寫在websocket API文檔中,我不知道我需要使用什麼,但是以非常難以理解的形式得到它,所以我不能使用任何規則因爲我沒有看到任何方案,所以問題是我無法解碼來自'socket.ondata'的數據,如果你能幫我理解那部分我真的很開心:) – Adam 2012-02-11 22:16:33

+0

@CIRK ,澄清,你不能使用WebSocket的HTTP庫,因爲** WebSocket不是HTTP **(初始握手是相似的,但這是相似性結束的地方)。您必須在較低級別上工作(例如在套接字級別)。您可以嘗試引用現有的工作實現,如[faye-websocket-node](https://github.com/faye/faye-websocket-node) – kanaka 2012-02-13 22:58:53

+0

謝謝,但您是什麼意思?我應該創建一個TCP服務器而不是HTTP嗎? – Adam 2012-02-14 00:37:08

0

有兩件事情 -

  1. 哪個版本的Node.js您使用的是?我從來沒有看到有開始和結束的數據事件。發出的事件只是緩衝區/字符串作爲參數的數據。

  2. 更重要的是,如果你是掛鉤到HTTP套接字,你應該照顧HTTP數據包中。它包含聽衆,身體和預告片。那裏可能有垃圾。

+0

謝謝@Satyam Shekhar,我的node.js版本是6.0,開始和不是空的,他們都是數字,我已經測試過它,但我只是遵循一些教程/其他作品,這就是爲什麼我以這種方式使用它。我不是很瞭解你的2.點:\ – Adam 2012-02-13 06:43:00

+0

'ondata'是一個內部使用的屬性...不是你想用的東西,如果你可以幫忙的話。 – Brad 2015-02-08 02:39:27

1

可以實際上開始與節點的HTTP API。這正是我在編寫WebSocket-Node模塊時所做的工作https://github.com/Worlize/WebSocket-Node

如果您不想使用現有的WebSocket庫(儘管您確實應該只使用現有的庫),那麼您需要能夠解析二進制數據格式由RFC定義。這是關於格式,究竟如何解釋這些數據很清楚。從每一幀必須在所有的標誌來讀取,解釋框的大小,可能讀掩蔽鍵,揭露的內容,你從電線讀取它們。

這就是您沒有看到任何可識別的內容的原因......在WebSockets中,所有客戶端到服務器的通信都被混淆,方法是使用XOR作爲安全預防措施對內容應用隨機掩碼,舊的代理服務器不知道websocket。