2012-12-20 102 views
7

修改後的問題:有人可以更好地解釋解碼器/編碼器?

好吧,所以我試圖將其納入我自己定製的遊戲中。我瞭解Netty服務器和客戶端如何連接的過程。我也理解解碼器和編碼器在理論上是如何工作的。但這仍然是我想要了解的。

我的服務器進程:

Server boots up -> Client starts 
Client requests connection -> Server accepts 
Server instructs client connection is good -> Client continues to the login screen 
(Ignoring any type of security protocol) 
Client sends username and password over Channel 
Server gets username and password checks it in the database or file 
Server pushes -> yes or no 
if yes Server sends player stats 
if no Server creates new player 

這個過程,我知道我需要有一個全球處理器使每個人都看到近乎實時更新之後。現在我不知道如何實現這個東西的解碼器。

我真的很想看到一些例子,說明它們是如何實現的。 與最好的一些說明.... 注:我不是說爲我解決這個問題,但告訴我如何處理不同的信息。最佳實踐和標準,請....

+0

我想補充一點,我正在引用Netty API以及它如何使用解碼器和編碼器......我感覺好像該指南並沒有詳細介紹實現您自己的解碼器以及如何實現。我還想重申一下,就像我最後一次說的那樣。我一直在我的頭上這一段時間,我似乎無法把握這... – Maxs728

回答

7

我提交this tutorial供您考慮。

沒有試圖勾引你,但我試圖解釋其中的確切奧祕。

這是系列中的第二個,您可能也需要read the first one

+0

我仍然在閱讀你的內容,並會在稍後決定回來...... – Maxs728

+0

我讀了這一切,雖然是的,這是非常有用的信息,它也是非常理論性的,並且不太喜歡代碼示例和類似的東西......儘管它很好地掌握了它的工作原理。謝謝!但是我仍然留下了一個重要問題....你如何實現你的解碼器/編碼器? – Maxs728

3

人們編寫自己的編碼器/解碼器(編解碼器),因爲Netty不強加也不定義應用程序級協議,因此您可以自由編寫自己的協議。例如,您定義的一組編解碼器是一種協議,可以是任何基於字符串和Protobuf的某種二進制格式之間的任何協議。 Netty爲您的便利提供了編解碼器(您使用的是示例)。

我會認爲這是爲了防止流被提前截斷?

通常,當要發送/接收的數據流,需要分解該固定長度塊(稱爲幀)。從互聯網開始就使用的一種常用方法是使用塊的長度(通常是4字節的int)作爲從流中讀取的第一個字段。所以如果第一個int的值是20,那麼你知道接下來的20個字節是有效載荷(數據),而第21個字節是另一個長度的第一個字節。這種方法的優點是它允許可變長度的塊。但你並不侷限於此。例如,如果您打算編寫一個使用具有預定義長度的字符串(使用填充)的協議,那麼您將編寫或甚至更好地使用適合它的Netty當前編解碼器。

一旦,我實現與三個解碼器的協議將在此順序執行:

  1. 接收流和在長度前綴的幀分解它;
  2. 將每個幀轉換爲一個字符串;
  3. 使用Jackson libray將字符串轉換爲預定義的Java對象。

編碼器只會做相同的操作,但是向後。不幸的是,我丟失了原始代碼,但我很快就會重寫它。

但如何流知道該流爲一個字符串或一系列INT的或一系列的雙打?你如何看待這個問題呢?

簡而言之:它不知道。您必須在編解碼器中編碼此信息。例如,可以使用操作碼作爲有效負載中的第一個字段,表示有效負載是字符串,雙精度,整數或兩者的任意組合。

基本上,Netty提供了一個流,你可以隨意解碼,只要你喜歡。例如,如果您正在讀取一系列long(8字節),那麼您將編寫一個從該流中一次讀取64個字節的編解碼器,因爲每個代表一個long。 Netty提供了開箱即用的編解碼器,因此您無需每次都重新發明輪子。

+0

謝謝,這是有道理的,並清除了一點點... ...在租賃有點讓我知道,我對它是如何工作的正確印象... – Maxs728