10

改訂された質問:

わかりましたので、これを自分のカスタムメイドのゲームに取り入れようとしています。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

このプロセスの後、誰もがほぼリアルタイムで更新を確認できるように、ワールド ハンドラーが必要であることがわかりました。今、このようなデコーダーを実装する方法がわかりません。

それらがどのように実装されているかについての説明とともに、いくつかの例を見たいと思います。できればいくつかの指示を添えて....注:私はこの問題を解決すると言っているわけではありませんが、さまざまな情報を処理する方法を教えてください。ベストプラクティスと基準をお願いします....

4

1 に答える 1

4

Nettyはアプリケーションレベルのプロトコルを課したり定義したりしないため、人々は独自のエンコーダー/デコーダー(コーデック)を作成します。そのため、独自のプロトコルを自由に作成できます。定義するコーデックのセットは、文字列ベースとProtobufなどのバイナリ形式の間のプロトコルです。Nettyはあなたの便宜のためにコーデックを提供します(あなたが使用したものは例です)。

これは、ストリームが早期に遮断されないようにするためだと思いますか?

通常、ストリームを送受信するときは、固定長のチャンク(フレームと呼ばれる)に分解する必要があります。インターネットの黎明期から使用されてきた一般的なアプローチは、ストリームから読み取られる最初のフィールドとしてチャンクの長さ(通常は4バイト整数)を使用することです。したがって、最初のintの値が20の場合、次の20バイトがペイロード(データ)であり、21番目のバイトが別の長さの最初のバイトであることがわかります。このアプローチの利点は、可変長のチャンクを許可することです。しかし、あなたはこれに限定されません。たとえば、事前定義された長さ(パディング付き)の文字列を使用するプロトコルを作成する場合は、それに適したNettyの現在のコーデックを作成するか、さらに適切に使用します。

かつて、次の順序で実行される3つのデコーダーを使用してプロトコルを実装しました。

  1. ストリームを受信し、プレフィックス付きの長さのフレームに分解します。
  2. 各フレームを文字列に変換します。
  3. Jackson librayを使用して、文字列を事前定義されたJavaオブジェクトに変換します。

エンコーダーは同じ操作を実行しますが、逆方向に実行します。残念ながら、元のコードを失いましたが、すぐに書き直します。

しかし、ストリームは、ストリームが文字列、一連のint、または一連のdoubleであることをどのように認識しますか?違いが問題だとどうやってわかりますか?

簡単な答え:わかりません。この情報をコーデックにエンコードする必要があります。たとえば、ペイロードがStrings、doubles、ints、または両方の任意の組み合わせであることを示す、ペイロードの最初のフィールドとしてオペコードを使用できます。

基本的に、Nettyはストリームを提供し、好きなように自由にデコードできます。たとえば、一連のlong(8バイト)を読み取る場合、それぞれが1つのlongを表すため、ストリームから一度に64バイトを読み取るコーデックを記述します。Nettyは、すぐに使用できるコーデックを提供しているため、毎回車輪の再発明を行う必要はありません。

于 2012-12-20T13:42:06.547 に答える