2016-06-03 3 views
1

Stephen C의 답변 here이 문제를 잘 설명합니다. 그는 Broken pipe 예외는 연결을 종료시키는 원인과 응용 프로그램이 아니라는 이유로 발생합니다. 나는이 모든 "무언가"가 일반적으로 연결될 수 있다는 것을 알고 싶습니다. 연결이 닫히고 있습니까? 그리고 그들을 다루는 가능한 방법은 무엇입니까?Java NIO SocketChannel IOException : 깨진 파이프

내 사용 환경 : 나는 Azure의 컴퓨터 세트에서 내 응용 프로그램을 실행 중이며 모두 컴퓨터 중 하나와 대화하고 있습니다. 거의 항상이 오류가 발생합니다.

TCP 시간 만료가 이유 중 하나 일 수 있습니까? 그렇다면 소켓 채널을 만드는 방법 (소켓이 소켓에 영향을 미치도록)으로 절대로 TCP 타임 아웃을 종료하지 마십시오.

답변

1

SocketChannel과 연결된 소켓을 가져온 다음 keepAlive 속성을 설정할 수 있습니다. 이 같은.

SocketChannel sockChannel; 
/* 
connect here 
*/  
sockChannel.socket().setKeepAlive(true); 
1

깨진 파이프 예외는 클라이언트가 수신 대기중인 소켓에서 멀리 이동할 때마다 발생합니다. 이는 서버가 느리게 응답하면서 클라이언트 측에서 소켓 시간 제한에 도달했기 때문일 수 있습니다. 예를 들어 브라우저의 경우 http 요청이 응답하는 데 오래 걸리는 경우 사용자가 브라우저를 닫으면 응용 프로그램 로그에 깨진 파이프 예외가 표시됩니다.

이제이 문제를 해결하려면 소켓 시간 제한을 늘리거나 서버 응답을 수정하십시오.

+0

감사합니다. @VineetKasat 어떻게 소켓 시간 초과를 늘릴 수 있습니까? 나는 [자바 의사] [1]보고 시도했지만 적절한 무언가를 찾을 수 없습니다. [1] https://docs.oracle.com/javase/7/docs/api/java/nio/channels/SocketChannel.html – PHcoDer

+0

시스템간에 어떻게 의사 소통하고 있습니까? 자바에서는 수정할 수있는 단순한 속성입니다. –

+0

감사합니다. @Vineet. 나는 SocketChannels을 사용하고이 채널에서 쓰기 작업을 읽는다. 그 재산은 무엇입니까? setSoTimeout()에 대해 이야기하고 있습니까? (일반 소켓에 사용됩니까?) – PHcoDer