1

私は、将来他のプロジェクトに使用できる非常に単純なネットワークライブラリを作成しています。現在、読み取り操作の処理に問題があります。SocketChannelsからのイベントの処理を担当するクラスがあり、入力バッファーと出力バッファーも含まれています。バッファを初期化するには、バッファのサイズを定義する必要があります。したがって、デフォルトでは、すべてのバッファのサイズは1024バイトです。

私が抱えている問題は、1024バイトを超えるパケットを読み取ると、例外が発生することです。これは、デフォルトでさらに大きなバッファ(たとえば、1024ではなく2048バイト)を割り当てることで修正できますが、それは簡単な方法のように思えます。特に、その解決策は好きではありません。

私が思いついた解決策は、非常に大きな直接の静的バッファー(Short.MAX_VALUEが大きい)を作成することでした。SocketChannelsからのすべてのデータは、大きなバッファーに読み込まれ、小さなバッファーにコピーされます(データに収まらない場合は、バッファーが拡張されます)。

データを絶えずクリアして大きな「キャリーオーバー」バッファに入れるには、多大なコストがかかるのではないかと心配しています。SocketChannel.available()のようなものがあればいいのですが、最も近い代替手段はSocket.getInputStream()。available()だけですが、そのメソッドはブロックします。そうすれば、バッファが収まるよりも多くの利用可能なデータがある場合、入力バッファ(大きなものではない)を拡張します。残念ながら、私にはできません。そのため、私が考えることができる唯一の解決策は、上記の解決策です。

私はここに尋ねに来ました...あなたの賢明な人の誰かが問題に対しておそらくより良い解決策を持っていますか?また、外部ライブラリは使いたくありません。個人的な好みです。

よろしくお願いします!


謝罪いたします。親友と話をしたところ、そもそも問題ないことに気づきました。かなり長い説明なので説明はしません。謝罪いたします。


ポスターへの注意:質問テキストは絶対に削除しないでください。それは他の人へのガイダンスとして役立ちます。

4

1 に答える 1

0

NIOソケットレイヤーを実装して、すべて同じサイズ(任意のサイズ)のバッファーの動的リストを作成しました。データを書き込む場合、バッファがいっぱいになると、新しいバッファがリストに追加され、データは引き続き新しいバッファに書き込まれます。(おそらくコードによって)データをソケットに書き込む準備ができていると判断されたら(セレクターのコールバックに基づいて)、すべてのバッファーがソケットに書き込まれるまで、各バッファーを書き込みます。

SocketChannelからの読み取りについても同様のことができると思います(ただし、読み取りの要件が異なるため、アプリケーションには実装しませんでした)。これがアプリケーションにとってより良いソリューションであるかどうかはあなた次第です。

なぜ例外が発生するのか完全にはわかりません...なぜバッファのサイズを超えて読み取ろうとするのですか?ソケットから読み取るロジックが何であれ、バッファのサイズを超えて読み取らないようにする必要があります。

于 2011-06-23T20:42:04.110 に答える