2017-11-16 5 views
0

서버 응용 프로그램이 수신 대기중인 경우 제대로 작동하는 netty 클라이언트가 있습니다. 그러나 서버 응용 프로그램이 실행 중이 아니므로 포트에서 수신 대기하지 않으면 클라이언트는 여전히 서버가있을 것으로 예상하는 것처럼 실행됩니다.Netty 서버가 포트에서 수신 대기중인 경우 어떻게 내 Netty 클라이언트를 감지 할 수 있습니까?

서버가 수신 대기하지 않는 경우를 처리하고 싶습니다. 그런 경우에도 데이터를 보내지 않고 (관리자에게 연락하도록 사용자에게 알리는 등) 대신 데이터를 보내지 않습니다. 이것은 가능한가?

참고 : 클라이언트가 지정되지 않은 포트 또는 IP에 연결을 시도하면 클라이언트에서 처리 할 수있는 예외가 발생합니다. 내 문제는 서버가 정상적으로 수신 대기해야하는 포트에서 수신 대기 중이 아닐 때 예외가 발생하지 않는다는 것입니다.

+0

[URLConnection.setConnectionTimeout] (https://docs.oracle.com/javase/8/docs/api/java/net/URLConnection.html#setConnectTimeout-int-)을 사용하여 연결을 시도 할 수 있습니다. –

+0

하지만 시간 초과가 끝날 때까지 기다려야합니다. 클라이언트가 어쨌든 끝날 때까지 기다렸다가 결과를 받았는지 확인하고, 그렇지 않은 경우에만 처리 ​​할 수 ​​있습니다. 하지만 시간 초과 나 클라이언트 종료를 기다리는 대신 서버가 무엇인지 알아내는 방법을 선호합니다. 또한 : 어떤 이유로 연결이 느린 경우 어떻게됩니까? 이 경우 시간 제한으로 연결이 중단되지 않습니까? – giro

+0

일종의 '핑 (ping)'입니다. localhost의 경우 포트를 자신에게 바인드하려고 시도 할 수 있지만 (포트가 자유 상태인지 확인) 끔찍한 해킹입니다. 죄송합니다. –

답변

1

Yeap. 때로는 서버가 다운되었거나 포트에서 더 이상 수신 대기하지 않는 것을 감지 할 수 없습니다.

그래서이 경우 클라이언트 파이프 라인에 ReadTimeoutHandler을 추가 할 수 있습니다. 특정 기간 내에 클라이언트가 서버에서 메시지를받지 못한 경우를 대비하여 ReadTimeoutException을 반환합니다. 그러나이 정도면 충분하지 않을 수 있습니다. 예를 들어, 서버와 클라이언트 간의 연결이 매우 활발하지 않은 경우이 예외가 발생할 수 있습니다. 따라서이 경우 연결이 활성화되어 있고 그 경우 예외가 발생하지 않도록 ReadTimeoutHandler에 알리는 탁구 핸들러를 구현해야 할 수도 있습니다.

+1

"PingPong 처리기"개념이 내 문제를 해결하는 것 같습니다. 몇 가지 인터넷 검색 후이 예제 코드를 시도했습니다. https://gist.github.com/Topher-the-Geek/6729681#file-pingpongserverhandler-java – giro