2012-07-05 2 views
1

나는 어제 this question을 물었고, 나는 싱글 스레드 파일 서버가 내 필요에 맞을 것이라고 확신했다. 네, 하나의 스레드와 함께, 파일 서버가 꽤 잘 (작은 파일에 대한), 초당 약 300 요청을 처리 할 수있는 문제가 지금은 (내가 사용 FileChannel.transferTo()) 쓰기 서버에 대한 블록 것입니다 대용량 파일을 처리하는 데는 꽤 시간이 걸리므로 다른 연결이 연결되지 않게합니다.FileChannel.transferTo()는 0 바이트를 계속 전송합니까?

대용량 파일 (약 800KB)을 전송할 때 이 0 바이트을 전송하는 것으로 나타났습니다. 다음과 같이 실패합니다 : java.io.IOException: Try again. 이것은 Android에 있습니다.

루프에 FileChannel.transferTo()을 넣었으므로 궁극적으로 전체 파일을 전송하기 위해 FileChannel.transferTo()이 수천 번 실행되는 상황이 발생할 수 있습니다.

제 질문은 무엇입니까? FileChannel.transferTo() 요청한 바이트를 전송하지 못했습니다. 이 문제를 어떻게 해결하고 대용량 파일을 처리 할 때 파일 서버를보다 신속하게 만들 수 있습니까?

+0

IOException이 발생하고 있습니까? – UVM

+0

'java.io.IOException : 다시 시도하십시오 .' 나는 Android에서 테스트를 마쳤습니다. – neevek

+0

[Java NIO SocketChannel.read()와 다중 스레드가 중복] (0120-336-501) – EJP

답변

0

이 메서드는 0을 반환하고 동시에 예외를 throw 할 수 없지만 '다시 시도하십시오'라는 메시지가 표시되면 전송 횟수를 줄여야한다고 제안합니다. 나는 상태가 사라질 때까지 그것을 절반으로 유지할 것이다. 어쨌든 루프에서 transferTo()으로 전화해야하므로 코드에 너무 많은 영향을 미치지 않습니다.

+0

맞습니다. '0'이고 '시도하십시오. 다시 '같은 시간에 발생할 수 없습니다,하지만 그들은 모두 일어난. 나는 당신이 [다른 질문] (http://stackoverflow.com/questions/10716057/java-nio-selectors-and-socketchannel-for-continues-streaming)에 올린 답변과 의견을 읽었습니다. NIO의 까다로운 부분. 필자는 필자의 이해를 파일 서버 구현에 적용하려고 노력할 것입니다. 'read'와'write'를 다루기 위해 worker 쓰레드가 필요합니다. – neevek

+0

@Neveek 아니, 당신은 내가 위에서 말한 것을 할 필요가 없습니다. – EJP

+0

실제로 IO를 수행하기 위해 여러 작업자 스레드를 사용했는데 성능이 좋지 않아 단일 스레드보다 느립니다. 왜? 그거 좀 자세히 설명해 줄 수 있니? – neevek

관련 문제