2012-01-12 19 views
0

私は、私のサーバーに接続されたクライアントに、小さなブロックで多くのデータを送信する必要があります。ループ内のチャンネルに書き込む

だから、私はのようなものを持っている:

for(;;) { 
    messageEvent.getChannel().write("Hello World"); 
} 
問題がネッティーバッファは、各繰り返しで明らかになっていないようないくつかの理由で、クライアントは、ダーティデータを受信して​​いるので、我々はこんにちは」のようなものを得た、ということです

WorldHello "どちらの場合

for(;;) { 
    messageEvent.getChannel().write("Hello World"); 
    Thread.sleep(1000); 
} 

答えて

0

使用すると、1つのアイテムが終了し、次の始まる場所を示すために何かを送る、またはどのように各長さ:

私は私のコードではほとんど変化がスレッドスリープを入れて作る場合は、すべてが正常に動作します項目はです。

2番目のケースでは、スリープがタイムアウトしてフラッシュされるため、クライアントはアイテムの最後と解釈する 'ブレーク'を認識します。

+0

を使用して、必要な場合は、これを無効にすることができます終了を示す – user1146287

+1

どちらの場合でも、クライアントは必要なだけの情報を読み込み、その時点で利用可能な項目を作成し、次の項目についてループします。最初の項目を読み取る前にクライアントが1秒以上待っていた場合、入力を読み取ると、最初の項目と2番目の項目の両方のデータが入力に表示され、それが単一の項目だと考えられます。 Iカスタムエンコーダを使用しない – MRAB

0

クライアントには、この「ダーティデータ」は表示されません。それが本当の場合、それはバグです。しかし、私は、正直に言えば、これにネットでつながる可能性のあるものは考えられません。すべてのChannel.write(..)イベントがキューに追加され、可能であればクライアントに書き込まれます。したがって、write(..)メソッドで渡されるすべてのデータが書き込まれます。データの「連結」はありません。

クライアントに送信する前にデータをバッファリングするカスタムエンコーダをパイプラインに用意していますか?

我々はハンドラがパイプラインにあるものを見るように、あなたはこのbehavoirを与える完全なコードを表示することができればそれはまた、役立つだろうなどMRABは、サーバーが示さずに、チャネル上で複数のメッセージを送信している場合は、言ったように

+0

、実際のコードは次のとおりのため\t \t(CoordinateVO座標:座標){ \t \t \t sendToClient.add(座標)。 \t \t \t IF(sendToClient.size()== 2){ \t \t \t \tストリングresultSerialized =新しいGson()。toJson(sendToClient、new TypeToken >(){} .getType()); \t \t \t \t logger.info( "送信:" + resultSerialized); \t \t \t \t ChannelBuffer channelBuffer = ChannelBuffers.buffer(resultSerialized.getBytes()。length); \t \t \t \t channelBuffer.writeBytes(resultSerialized.getBytes()); \t \t \t \t e.getChannel()。write(channelBuffer); \t \t \t \t \t \t \t \t \t \t \t \t sendToClient.clear()。 \t \t \t \t \t – user1146287

+0

「コード」を「コードマークアップ」に挿入できますか?その本当に読みにくい.. –

1

各メッセージの終わりには、クライアントは常にメッセージを正しく読み取ることができません。メッセージを書き込んだ後にスリープ時間を追加することで、問題の根本原因を解決することもできません。

クライアントとサーバーの両方がNettyを使用している場合、あなたのjsonハンドラの前にLengthFieldPrependerとLengthFieldBasedFrameDecoderを追加することができます。デフォルトでは

String encodedMsg = new Gson().toJson(
sendToClient,newTypeToken<ArrayList<CoordinateVO>>() {}.getType()); 

、Gsonはいつか、これは有線エンコーディングにつながる、コンテンツのためのエスケープHTMLを使用して、私は何を使用していない両方の場合でGson工場

final static GsonBuilder gsonBuilder = new GsonBuilder().disableHtmlEscaping(); 

.... 

String encodedMsg = gsonBuilder.create().toJson(object); 
+0

どのように私はLengthFieldPrependerとLengthFieldBasedFrameDecodeパラメータを追加できますか?再度、感謝します! – user1146287

関連する問題