본문 바로가기
PROGRAM/JAVA / JSP

java.net.SocketException : Broken pipe

by ojava 2015. 9. 16.
반응형

파일 다운로드 부분에서 가끔 해당 에러가 발생한다.

 

java.net.SocketException : Broken pipe

 

가끔인걸로 보아 다운로드 로직 자체의 문제는 아닌 것 같아서

지금까지는 그냥 뒀는데 계속 발생하면 곤란하므로 원인을 파악하고자

구글링을 해봤는데 다음과 같은 이유일 수 있다고 한다.

 

 

  1. 이미 닫힌 Connection을 사용하려고 하는 경우

    해당 경우는 파일 다운로드 기능 구현 시, FileInputStream과 BufferedOutputStream 등
    열고 닫는 연결 구조를 사용하게 되는데 닫혀진 Connection을 사용하려고 시도하는 경우에
    발생할 수 있다고 한다.

    그러나... 아주 순차적으로 잘 닫아줬고 그렇게 구현했다면 다운로드 시도할 때마다 발생할테니
    이건 본인에게 해당되는 사항이 아닌 것 같으므로 패스 ㅋ.ㅋ

  2. Server Side에서 보내는 요청에 대해 Client가 제대로 수신하지 못한 경우

    사용자가 다운로드를 시도해놓고 브라우저를 닫았거나, 다른 페이지로 이동했거나,
    뒤로가기를 눌렀다거나, 처리중인 요청에 대해 기다리지 못하고 계속 새로고침하면 소켓이 끊기게 된다.
    이에 대해 다음 블로그에서 고급지게 표현한 단어가 있어서 이를 차용한다.

    Client와 WAS의 통신이 단절되어 발생한 문제.
    연결이 끊겨서 최초 요청한 작업정보가 없어서 서버가 응답할 대상이 없어져서 발생한 문제라는 의미다.

    이 중 사용자가 브라우저에서 다른 액션을 취해서 Broken pipe가 발생하는 경우라면
    깔끔하게 무시해도 되겠지만 결과값에 대한 응답이 없어서 시간초과로 예외가 발생하면 확인이 필요하당. 

Timeout으로 인해 발생하는 문제라면 기존 서비스 구현 방식에서 확인할 부분이 아니라

서버 환경에서 Timeout 설정값을 확인해주어야 한다.

아주 대용량이라서 보내는 시간이 많이 걸려서 발생하는 문제라면 Timeout 값을 좀 더 늘려주면 되는데

WAS보다는 이에 대해 응답받는 Web Server의 Timeout에 걸렸을 확률이 높다고 한다.

(WAS 앞에 Web Server가 별도로 있으면 변경 가능. WAS가 직접 서비스하여 사용자 PC와 직접 통신하는 경우는.. 하..)

 

 

 

사용자가 다른 액션을 취해서 Socket이 끊겨서 발생하는 예외의 상세한 내용이 잘 나와있어서 여기에 인용합니당.

 

사용자가 원하는 서비스 구동을 위해 웹 브라우저에서 서버에 연결을하면 
accept된 socket을 HttpThread에 넘기고, ThreadPool에서 조건에 맞으면 해당 HttpThread를 기동하게 됩니다.

서비스 요청에 HttpThread를 이용하게 되는데, 서버에서는 이 HttpThread의 Socket과 통신을 하게 되져.
서비스 응답이 완료되기 전까지 다시 재요청을 하지 않으면 아무 문제가 없으나...
늘 문제는 HttpThread가 완료되전에 재요청을 한다는 점 ㅠㅠ

 

첫번째 요청때 생성된 Socket의 자원을 HttpThread.run()에서 사용하려고 하는 중에,
두번째 요청이 들어오니까 첫번째 요청의 Socket이 끊어져 버리기때문에 생기는 문제라고 합니다.

< 인용 : http://webprogrammer.tistory.com/1793 > 

 

 

 

사용자가 끊어버려서 발생하는 해당 에러에 대해서는 종료하지 말라고 할 수도 없고 하니...

무시가 방법이군여.

 

반응형