오류 발생 원인
java.net.SocketException: Broken pipe
: 보통 잦은 입출력 호출로 발생된다.
처리 중인 요청(또는 응답)을 사용자가 기다리지 않고,
'새로고침(또는 종료, 연속 클릭 등)'을 자주 실행하게 되면 소켓이 끊어져서 발생된다.
java.io.IOException: Broken pipe
: receiver에서 송신 받은 데이터를 제때 처리하지 못하는
상황(네트워크가 느리거나 서버의 CPU가 max인 경우 등)에서 sender가 계속 보내는 경우.
두 소켓상의 통신에서 소켓을 담당하던 프로세서가 갑작스런 이상으로
종료가 된 상황에서 상대 소켓은 이를 알지 못하고 데이터를 전송하려 할때 발생하게 된다.
(ex, 클라이언트에서 요청을 하였는데 서버에서 작업을 완료하여 클라이언트로 결과를 넘겨주기 전 네트워크가 끊겼을 경우,
클라이언트가 정지 버튼을 누른다든지, 브라우저를 종료한다든지, 다른 화면으로 이동하였다든지 등의 경우)
최초 요청한 정보가 사라졌기 때문에 서버 측에서 작업 결과를 전달할 곳이 없어서 발생하는 현상이다.
해결 방법 3가지
1. request 후 response 기다리기
: Client에서 보낸 데이터를 받고 리턴할 때 까지 응답을 기다리도록 설정
2. Exception 무시하기
: Client가 비정상적인 종료를 했을시 Broken pipe signal이 발생하고
Client의 종료를 서버에서 제어할 수 없기 때문에 해당 시그널을 무시하게 해준다.
3. 중복 요청 막기
: 연속적인 버튼 클릭을 방지하거나 execption 처리 부분에서 오류를 뱉지 않도록 처리한다.
'[개발] Programming > Java' 카테고리의 다른 글
GC overhead limit exceeded, String 대신 StringBuilder 사용 등 해결 방법 (0) | 2018.11.09 |
---|---|
자바, 클라이언트 정보 조회 (IP, 에이전트, 브라우저, OS 정보) (0) | 2018.11.09 |
자바 쿠키 다루기 (쿠기 생성, 조회, 삭제) (0) | 2018.11.08 |
자바 HashMap vs Hashtable 차이점, 예제 (0) | 2018.11.08 |
자바, 몇몇 특수문자로 split이 안될 때 해결 방법 (2) | 2018.11.08 |
댓글