2011-10-26 33 views
1

我正在爲最新版本的草稿製作Java服務器。我設法建立了聯繫,這很好。Java中的WebSocket服務器(hybi 10)發送和接收

問題是我不明白數據是如何編碼的,我一直在試圖找到它如何完成的一些例子,但我找不到任何東西。所以我試圖自己做,但需要一些幫助。

Here是框架的圖像。

但我不明白有效載荷在哪裏開始。什麼是:

擴展的有效載荷長度(六十三分之一十六)(如果有效載荷LEN ==127分之126)

這就是我的有效載荷應該待的地方?

有人可以給些幫助,因爲你可能會看到,我完全失去了...

回答

2

的問題是,長度並不總是適合在7位(只能表示數字0到127用7位),在此情況下以下任一2或8個字節將被用於使長度配合:

  • 126指的是下述2個字節用於長度
  • 127指的是下述8字節用於長度

所以如果沒有編碼,有效負載從索引2,4或10開始。編碼時,它從6,8或14開始(因爲有4個掩碼字節)。

我以前發佈some pseudocode關於解碼有效載荷數據。


實際得到的長度爲「實數」(而不是單獨的字節),你可以使用按位移位運算如下(如果有兩個字節長度):

var length = (bytes[2] << 8) | (bytes[3] << 0); 

這將計算的話是這樣的:

假設:

  • bytes[2]01101001105在基座10)
  • bytes[3]10100101165在基座10)

然後<<會做:

01101001 00000000 // moved 8 places to the left, filled with zeroes 
     10100101 // moved 0 places (nothing really happening, you can eliminate '<< 0') 

|基本上將它們相加:

01101001 00000000 
     10100101 
----------------- | 
01101001 10100101  (in base 10 that's 27045) 

所以,如果你有字節105165,那麼它們代表的長度爲27045

+0

偉大的鏈接,另一個問題,我怎麼知道要讀多少字節?因爲我不知道websocket的「框架」的大小,在java中,我正在閱讀使用「dataInputStream.read(bytes,totalToRead,leftToRead)...任何想法???完全失去......謝謝一個收益! – Andres

+0

@Andres:我不知道Java,但正如我所說的框架包括長度。在我發佈的三種情況下,你可以得到的長度與第二個字節(最後7位),第三個和第四個字節或第三個到第十個字節 – pimvdb

+0

@Andres:如果您不知道如何解釋字節並將它們轉換爲長度,請查看我的編輯。 – pimvdb

相關問題