0

サーバー アプリとクライアント アプリの間で Java ソケットを使用するアプリケーションを開発しています。これらのソケットを介してクライアントからサーバーにサイズ 64k のファイルを送信する必要があります。すべてのシステム (サーバーとクライアントの両方) をローカルで実行するとすべて問題なく動作しますが、サーバーとクライアントを別のマシンで実行すると失敗します。

JSON を使用してファイル コンテンツを処理しているため、サーバーでスローされる例外は「net.sf.json.util.JSONTokener.syntaxError」です。ただし、問題は JSON ではなく、ファイルのサイズです。サイズが 8k 未満のファイルを送信するとすべて問題ありませんが、サイズが大きくなると送信情報が切り捨てられるため、サーバーが切り捨てられた受信情報を解釈しようとすると JSONTokener.syntaxError がスローされます。

次のように 64k のソケット バッファを定義しています (NIO API を使用しています)。

SocketChannel sc;
private static final int BUFFER _SIZE = (int)Math.pow(2, 16);
.....
sc.socket().setReceiveBufferSize(  BUFFER_SIZE );
sc.socket().setSendBufferSize( BUFFER_SIZE );

システムをリモート モードで実行しているときに、ネットワーク パッケージのサイズを拡大するにはどうすればよいですか? どれが問題なのか分かりますか? 事前にどうもありがとうございました。

オスカー

4

1 に答える 1

0

通常、バッファ サイズは 64K を超えているため、実際に縮小することができます。

通常、TCP パケットの MTU は 1.5 KB であり、これを変更しても問題が解決する可能性はほとんどありません。いずれにせよ、9000 バイトは私がこれまでに設定した中で最大です。

あなたが抱えている問題は、データの書き込み方法にある可能性がありますが、データの読み取り方法にあると思われます。送信したのと同じサイズのデータ​​を受け取る、またはすべてを一度に受け取ると想定するのはよくある間違いです。

ストリームは、書き込んだデータのサイズを「認識」しておらず、長さを含むプロトコルがない限り、送信されたすべてのデータがいつ受信されたかを知りません。

于 2012-07-20T18:05:03.463 に答える