2017-12-25 12 views
0

接続に障害が発生した場合にはモード転送されたデータの量は?

bytesTransferred = fileIChannel.transferTo(0, fileIChannel.size(), socketChannel); 
// or using a buffer 
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(1024*8); 
while (fileIChannel.read(byteBuffer) != -1) { 
byteBuffer.flip(); 
bytesTransferred += socketChannel.write(byteBuffer); 
byteBuffer.clear(); 

ブロッキングソケットを介してファイルを送信し、私は転送されたバイトの数を維持する必要があります。 これは、特定のバイト数を受け取ったときにサーバーからの応答をすべて待つことで実行できます。または、接続が復元されると、受信したバイト数の要求を送信します。どのオプションがより正確になるのですか?この問題は通常どのように解決されますか?

もう1つの質問です。大容量のデータをソケット経由で送信する際にデータの整合性が保証されていますか?

+0

あなたのコードが何をしていると思いますか分かりません。 -1に対してチェックするだけでなく、実際に何ビットが読み取られたかを確認する必要があります。その番号はread()の呼び出しごとに変わる可能性があるためです。そして、はい、TCP層は少しのエラー検出を行います。自分で簡単に調べることができるはずです。 – GhostCat

+0

@GhostCatありがとうございます。 'flip()'メソッドは、実際に読み取られたデータの数に制限を設定します。 –

答えて

1

このコードではわかりません。ピアアプリケーションが送信されたデータを受信して​​処理したことを知りたい場合は、ピアアプリケーションから通知が必要です。 TCPは両端でバッファリングを行うため、APIだけでは伝えられません。

NBコピーループが間違っています。それは次のようになります:

while ((fileIChannel.read(byteBuffer) != -1 && byteBuffer.position() > 0) 
{ 
    byteBuffer.flip(); 
    bytesTransferred += socketChannel.write(byteBuffer); 
    byteBuffer.compact(); 
} 

また、書き込みに関するエラーテストが必要です。現在のところ、すべての書き込みですべてがSocketChannelに書き込まれたと仮定していますが、非ブロックモードでは保証されていません。

transferTo()を使用しているコードも間違っています。transferTo()は転送全体を実行することが保証されていないため、カウントが返されます。ループする必要があります。

関連する問題