2017-12-25 4 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(); 

블로킹 소켓을 통해 파일을 전송, 나는 전송 된 바이트의 수를 유지해야합니다. 특정 바이트 수를 받으면 서버에서 응답 할 때까지 기다리면됩니다. 또는 연결이 복원되면받은 바이트 수를 요청합니다. 다음 중 올바른 옵션을 선택해주세요 (복수 선택 가능). 이 문제는 보통 어떻게 해결됩니까?

두 번째 질문입니다. 소켓을 통해 대용량 데이터를 전송할 때 데이터 무결성이 보장됩니까?

+0

코드가 어떤 생각을하고 있는지 잘 모르겠습니다. 당신은 단지 -1과 비교해서는 안됩니다 ... 그러나 실제로 얼마나 많은 비트가 읽혔는지보십시오. 그 수는 read() 호출마다 달라질 수 있기 때문입니다. 그리고 예, TCP 계층은 약간의 오류 탐지를 수행합니다. 당신은 쉽게 자신을 연구 할 수 있어야합니다. – GhostCat

+0

@GhostCat 감사합니다. 'flip()'메소드는 실제로 읽은 데이터의 수를 limit로 설정합니다. –

답변

1

이 코드는 알 수 없습니다. 피어 응용 프로그램이 전송 된 데이터를 수신하고 처리 한 사실을 알고 싶다면 피어 응용 프로그램에서 알려야합니다. TCP는 양쪽에서 버퍼링을하므로 API만으로는 말할 수 없습니다.

NB 복사 루프가 잘못되었습니다. 그것은이어야합니다 :

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

그리고 또한 쓰기에 대한 오류 테스트가 있어야합니다. 현재 모든 쓰기 작업시 모든 내용이 SocketChannel에 기록되었다고 가정하고 있으며 비 차단 모드에서는 보장되지 않습니다.

transferTo()을 사용하는 코드는 잘못되었으므로 transferTo()은 전체 전송을 수행 할 수 있다고 보장하지 않습니다. 이것이 바로 계산을 반환하는 이유입니다. 반복해야합니다.

관련 문제