WAS, DBMS 서버 등과 연결되는 Socket 관련 프로그램에서 다음과 같은 오류 메세지가 자주 발생한다.
Connection reset by peer, Connection reset, Broken Pipe
이런 에러가 발생해도 정상적으로 잘 서비스되기 때문에 별로 관심을 안가졌는데 직접 데몬 서비를 만들고 관련 클라이언트를 만들다 보니 어떤 경우에 이런 에러가 발생하는지 알아야지만 대처가 가능할 것 같아서 찾아 보았다.
– java.net.SocketException: Connection reset by peer: socket write error
원인: write 시 상대방 socket close 된 경우
– java.net.SocketException: Connection reset
원인: read 시 상대방 socket close 된 경우
– java.io.IOException: Broken pipe
원인: receiver에서 송신받은 데이터를 제때 처리하지 못하는 상황(네트워크가 느리거나 서버의 CPU가 max인 경우 등)에서 sender가 계속 보내는 경우
결론적으로 위의 두 종류의 Exception은 데이터를 요청한 측(브라우저 등)에서 서버에서 데이터를 다 보내기 전에 강제로 닫아 버리거나 종료해버릴때 발생하는 것이기 때문에 큰 문제는 되지 않는다. 하지만 Broken Pipe의 경우 정상적으로 데이터를 보내지만 받지 못하는 상황이 발생하기 때문에 문제가 된다.
Broken Pipe의 경우 클라이언트는 계속 해서 데이터를 보내는 것이 아니라 하나의 레코드를 보낸 다음 서버에서 정상적으로 수신했다는 신호를 받고 다시 보내는 형태로 구현하면 된다. 속도가 좀 떨어진다는 단점이….
마지막으로 Read timed out 이 발생하는 것은 Buffered 관련 기능을 사용할 경우에 많이 발생하는데, client/server간에 서로 신호를 주고 받으면서 read, write 하는 경우 write 한 후 flush(), close()를 하지 않게 되면 실제 데이터는 receiver로 전송되지 않게 된다. 이때 receiver는 일정 시간 동안 데이터가 오지 않으면 timeout 된 것으로 간주하게 된다.