Java NIO : IOException : Broken pipe는 무엇을 의미합니까? [복제]
이 질문에 이미 답변이 있습니다.
일부 Java NIO 연결의 경우 SocketChannel.write(ByteBuffer)
호출을 받으면 IOException
"Broken pipe"가 발생합니다.
"파손 된 파이프"의 원인은 무엇이며 더 중요한 것은 해당 상태에서 복구 할 수 있다는 것입니다. 복구 할 수없는 경우 되돌릴 수없는 문제가 발생했으며이 소켓 연결을 닫아야한다는 좋은 신호 인 것 같습니다. 그것은 합리적인 가정입니까? IOException
소켓 연결이 처음에 제대로 연결되어있는 동안 (어떤 지점에서 작동하지 않는 연결이 아닌) 이런 일 이 발생하는 경우가 있습니까?
보조 노트에, 항상 전화를하는 것이 현명하다 SocketChannel.isConnected()
을 시도하기 전에 SocketChannel.write()
, 그렇다면, 나는 또한 연결이 "끊어"하고 둘 경우 폐쇄해야한다고 가정 할 수있다 SocketChannel.isConnected()
및 SocketChannel.isConnectionPending()
모두 false
?
감사!
"파이프 파손"의 원인은 무엇이며 더 중요한 것은 해당 상태에서 복구 할 수 있다는 것입니다.
연결이 끊어지는 원인이 원인입니다. (연결을 닫은 것은 애플리케이션이 아닙니다. 다른 예외가 발생했을 것입니다.)
연결을 복구 할 수 없습니다. 새로운 것을 열어야합니다.
복구 할 수없는 경우 되돌릴 수없는 문제가 발생했으며이 소켓 연결을 닫아야한다는 좋은 신호 인 것 같습니다. 그것은 합리적인 가정입니까?
네, 그렇습니다. 해당 예외를 받으면 소켓이 다시 작동하지 않습니다. 그것을 닫는 것이 유일한 현명한 일입니다.
IOException
소켓 연결이 처음에 제대로 연결되어있는 동안 (어떤 지점에서 작동하지 않는 연결이 아닌) 이런 일 이 발생하는 경우가 있습니까?
아니요 (또는 적어도 OS의 네트워크 스택, JVM 및 / 또는 애플리케이션의 적절한 동작을 파괴하지 않고서는 안됩니다.)
SocketChannel.isConnected()
시도하기 전에 항상 전화하는 것이 현명합니까SocketChannel.write()
...
일반적으로 r.isXYZ()
(외부) 리소스를 사용하는 호출 전에 호출하는 것은 좋지 않습니다 r
. 리소스 상태가 두 호출 간에 변경 될 가능성이 적습니다 . IOException
조치를 취하고 실패한 조치의 결과 (또는 기타)를 포착하고 필요한 조치를 취하는 것이 더 좋습니다 .
이 특별한 경우에 부름 isConnected()
은 무의미합니다. 이 메서드는 true
소켓이 과거의 어느 시점에 연결 되었으면 반환하도록 정의됩니다 . 연결이 여전히 활성 상태인지 여부는 알려주지 않습니다. 연결이 아직 살아 있는지 확인하는 유일한 방법은 연결을 사용하는 것입니다. 예를 들어 읽기 또는 쓰기를 수행합니다.
깨진 파이프는 단순히 연결이 실패했음을 의미합니다. 복구 불가능하다고 가정 한 다음 필요한 정리 작업 (연결 닫기 등)을 수행하는 것이 합리적입니다. 나는 단순히 연결이 아직 완료되지 않았기 때문에 이것을 볼 것이라고 믿지 않습니다.
비 차단 모드를 사용하는 경우 SocketChannel.connect 메서드는 false를 반환하고 isConnectionPending 및 finishConnect 메서드를 사용하여 연결이 완료되었는지 확인해야합니다. 일반적으로 "isConnected"에 대한 빈번한 호출에 의존하지 않고 일이 작동 할 것이라는 기대에 따라 코드를 작성한 다음 예외를 포착하여 실패를 감지합니다.
끊어진 파이프는 이미 다른 쪽 끝에서 닫힌 연결에 쓴 것을 의미합니다.
isConnected()
이 조건을 감지하지 않습니다. 쓰기 만합니다.
SocketChannel.write ()를 시도하기 전에 항상 SocketChannel.isConnected ()를 호출하는 것이 현명합니까?
무의미합니다. 소켓 자체 입니다 연결. 연결했습니다. 무엇 수 있습니다 연결되지하면 연결 자체이며, 당신은 단지 그것을 시도하여 그것을 확인할 수 있습니다.
소켓이 다른 쪽 끝에서 닫혀 있다고 가정해야합니다. IOException에 대한 try catch 블록으로 코드를 래핑합니다.
isConnected ()를 사용하여 SocketChannel이 연결되었는지 여부를 확인할 수 있지만 write () 호출이 완료되기 전에 변경 될 수 있습니다. catch 블록에서 호출하여 실제로 이것이 IOException이 발생하는 이유인지 확인하십시오.
참고 URL : https://stackoverflow.com/questions/1181255/java-nio-what-does-ioexception-broken-pipe-mean
'code' 카테고리의 다른 글
비디오 스트림의 TCP 대 UDP (0) | 2020.09.12 |
---|---|
Kotlin 보조 생성자 (0) | 2020.09.12 |
MarshalByRefObject의 주요 용도는 무엇입니까? (0) | 2020.09.12 |
Android 앱 메모리 부족 문제-모든 것을 시도했지만 여전히 손실 (0) | 2020.09.12 |
Makefile에서 괄호 $ ()와 중괄호 $ {} 구문의 차이점은 무엇입니까? (0) | 2020.09.12 |