2014-05-19 2 views
2

flush() 메시지가 서버 OutputStream에서 수신되면 클라이언트는 메시지를 수신했는지 여부를 확인합니다 (시간 초과되기 전에 연결이 끊긴 경우). 어떻게 든이 상황을 서버 측에서 제어해야합니다. 클라이언트가 메시지를 보내기 전에 메시지를받을 수 있는지 알아야합니다. 어떻게 할 수 있니?Java 소켓 : 클라이언트가 서버로부터 메시지를 수신 할 수 있는지 확인하십시오.

+0

메시지가 TCP/IP를 통해 완벽하게 전달되었는지 여부를 알아야 할 경우 클라이언트에서 일종의 ACK 메시지를 다시 보내야합니다. –

+0

예를 들어,이 ACK 메시지는 메시지가 전송 된 시간 일 수 있습니다. 클라이언트가 메시지를 수신하면 동일한 시간 메시지를 서버로 보내고이 방법으로 서버는 메시지가 수신되었음을 알게됩니다. 문제는 클라이언트를 쉽게 수정할 수 없다는 것입니다. – justasd

답변

1

과거에는 클라이언트 메시지를 읽고 필요에 따라 보급하기 위해 일반적으로 별도의 스레드에서 차단 읽기를 사용했습니다.

클라이언트가 연결을 끊으면 InputStream.read() 연산은 -1을 반환하고 클라이언트에 "연결이 끊어졌습니다"라는 알림 메시지를 표시하고 InputStream을 닫아야합니다. 또한 연결이 비정상적으로 종료되면 IOException을 throw 할 수 있습니다.

그런 다음 메시지를 쓸 수 있는지 여부를 확인하기 위해 Socket.isClosed()을 테스트 할 수 있습니다.

+0

감사합니다. 한가지 더 질문 : 별도의 스레드가 주 스레드와 동일한 InputStream을 사용해야합니까? – justasd

+0

다른 스레드에서 모든 독서를해야합니다. 비동기 적으로 클라이언트에 쓸 필요가없는 경우 논리를 모두 단일 스레드에서 관리 할 수 ​​있습니다. 외부 루프 블록은 읽기, 내부 루프는 응답을 씁니다. –

1
당신은 TCP/IP 연결을 사용하고 있으리라 믿고있어

하십시오 메시지 패킷이 프로토콜은 아래 (승인으로 응답해야 수신기에 전송 될 때마다 :

TCP는 연결 지향 프로토콜입니다 응용 프로그램 계층이므로 오류가 발생하지 않으면 메시지가 수신되었다고 가정 할 수 있습니다. 메시지를 보내기 전에 메시지가 수신되는지 여부를 알 수는 없지만 연결이 작동 중이면 메시지가 작동한다고 가정 할 수 있습니다.

+0

예, TCP/IP 연결입니다. 문제는 메시지가 전달 된 것처럼 보이지만 오류가 발생하지 않는다는 것입니다. 입/출력 스트림과 소켓 자체는 닫히지 않습니다. 이 상황은 TCP "messages"가 승인되지 않은 시간 제한 – justasd

+1

전에 클라이언트가 인터넷 연결을 끊을 때 발생합니다. 개별 패킷은 ACK를받습니다. –

+0

@SteveC 죄송합니다. 당신 말이 맞습니다!, 고쳐주십시오. –

관련 문제