0

チャット クライアントの送信オプションを作成しようとしていますが、小さなファイルではできましたが、大きなファイルで実行しようとすると問題が発生しました。私がそれを解決しようとした方法は次のとおりでした:クライアント側、ファイルから読み取り、送信:

while ((buf = bin.read(bytearray, 0, bytearray.length)) != -1) {
     os.write(bytearray,0,bytearray.length);
}
bin.close();

「bin」は fileInputStream からの私の bufferedInputStream です。「buf」は単なる整数です。os は私の DataOutputStream です。サーバー側、送受信:

while ((buf = in.read(bytes, 0, bytes.length)) != -1) {
dos.write(bytes,0,bytes.length);
}

"in" は DataInputStream、"buf" は整数、"dos" は DataOutputStream (すべてのクライアントに対してこれを行います) クライアント側、サーバーからファイルを受信し、ハード ドライブに書き込みます。

int buf;
while ((buf = in.read(bytes, 0, bytes.length)) != -1) {
     fos.write(bytes,0,bytes.length);
}
fos.close();

ここで、「in」は DataInputStream、「fos」は FileOutputStream です。最初のクライアントで送信ボタンを押すと、サーバーとクライアントの両方がファイルの受信を開始しますが、2 番目のクライアント (レシーバー) を閉じたときにのみ受信されます。実際には、ファイルの受信を停止して書き込みを終了することを決定します。送信が一度実行され、dataInputStream がサーバーで空である必要があるときに「-1」を受信しない理由を教えてください。したがって、「-1」が発生します。

4

1 に答える 1

2

DataOutputStreamは-1 を送信しません。出力ストリームを閉じると、基礎となるトランスポートがピアに EOS を通知します。これは、検出されたときに read() API によって -1 として返されます。ワイヤに -1 はありません。出力ストリームを閉じないと、-1 を受け取りません。

出力ストリームを閉じずにリーダーに読み取りを停止させたい場合は、アプリケーション プロトコルの一部として何らかの方法でそれを伝える必要があります。たとえば、データの前に長さワードを送信し、リーダーに正確にそのバイト数を読み取らせます。

于 2013-01-13T03:38:00.213 に答える