2011-06-02 44 views
0

我有一個由WebSocket客戶端接收的數據組成的字節數組。我擁有的數據可以是1個接收,也可以是緩衝數據+上次接收。這取決於天氣或沒有任何數據緩衝。查找字節數組中的框架數據

現在,真的有3收到數據時應該發生的事情有可能,他們是如下(注意,這是我結合一個緩衝接收到的數據後):

  1. 已收到部分消息:客戶端開始傳輸消息,並且只有部分消息(開頭)已經過槽。我收到的數據需要進行緩衝,直到收到其他數據。
  2. 已收到全部消息:客戶端已發送完整消息。應該用消息解僱一個事件。
  3. 已收到一個關閉信號:客戶端發送了關閉信號的請求。

現在,沒有理由爲什麼不應該立即發生其中的幾個(例如,接收到1個半消息,或接收到1個消息和關閉信號)。 websocket中的消息以0x00和0xFF字節組成,換句話說,收到的消息如下所示:0x00,...binary UTF8 data,0xFF,0x00,...binary UTF8 data,0xFF,結束信號如下所示:0xFF,0x00。現在,我需要的是一種有效的方式來接收傳入的數據流並將其分解爲消息或結束信號。我從來沒有像這樣使用過框架數據,所以我不知道如何有效地做到這一點。我想要的是或多或少的函數,它將二進制數據作爲一個數組接收,並返回消息(作爲沒有幀的二進制數據)或關閉標誌,以及一個字節數組與緩衝數據。重要的是它速度快,不會消耗太多不必要的內存。或者如果你有一些可能幫助我解決這個問題的鏈接,我會很樂意接受它們。

回答

0

你的接近信號只是一個空的信息,並不是一個特例。

所以你有什麼是在行和解釋的消息段之間的不匹配。

它看起來並不難,你必須從字節流中提取0x00到0xFF之間的序列。您需要一個比最大消息大的緩衝區,您將不得不掃描所有傳入的字節並提取完整的消息,並將剩餘部分向下移動到緩衝區中。

您還需要:

  • ,以驗證您的UTF8數據不能包含爲0x00或0xFF的,我不知道這是真的
  • 處理是將0xFF後跟比別的東西的情況下0x00
+0

由於字節順序相反,close信號不是空消息,導致如下所示:'..data,0xFF,0xFF,0x00'。另外,數據不應該包含0x00和0xFF。但是,我需要知道如何去做的是你在這裏寫的內容:「你將不得不掃描所有傳入的字節並提取完整的消息,並將剩餘部分向下移動到緩衝區中。我不知道如何在代碼中以一種好的方式來做到這一點。我爲此編寫的原型使用Linq的Skip(1).TakeUntill(b => b == 0xFF)'來獲取消息,但是它使用一個枚舉來獲得低谷,並且效率不高,或者是我錯誤? – Alxandr 2011-06-03 10:31:40

+0

@Alxandr:它的效率如何?只有你可以說,因爲只有兩個重要的措施:「夠好」和「不夠好」。測量它並看看。 – 2011-06-03 22:28:03

+0

現在看來它已經夠好了,但我必須對它進行壓力測試並看看。 – Alxandr 2011-06-04 12:13:27