flush()
메시지가 서버 OutputStream
에서 수신되면 클라이언트는 메시지를 수신했는지 여부를 확인합니다 (시간 초과되기 전에 연결이 끊긴 경우). 어떻게 든이 상황을 서버 측에서 제어해야합니다. 클라이언트가 메시지를 보내기 전에 메시지를받을 수 있는지 알아야합니다. 어떻게 할 수 있니?Java 소켓 : 클라이언트가 서버로부터 메시지를 수신 할 수 있는지 확인하십시오.
답변
과거에는 클라이언트 메시지를 읽고 필요에 따라 보급하기 위해 일반적으로 별도의 스레드에서 차단 읽기를 사용했습니다.
클라이언트가 연결을 끊으면 InputStream.read() 연산은 -1을 반환하고 클라이언트에 "연결이 끊어졌습니다"라는 알림 메시지를 표시하고 InputStream을 닫아야합니다. 또한 연결이 비정상적으로 종료되면 IOException을 throw 할 수 있습니다.
그런 다음 메시지를 쓸 수 있는지 여부를 확인하기 위해 Socket.isClosed()을 테스트 할 수 있습니다.
감사합니다. 한가지 더 질문 : 별도의 스레드가 주 스레드와 동일한 InputStream을 사용해야합니까? – justasd
다른 스레드에서 모든 독서를해야합니다. 비동기 적으로 클라이언트에 쓸 필요가없는 경우 논리를 모두 단일 스레드에서 관리 할 수 있습니다. 외부 루프 블록은 읽기, 내부 루프는 응답을 씁니다. –
하십시오
메시지
패킷이 프로토콜은 아래 (승인으로 응답해야 수신기에 전송 될 때마다 :
TCP는 연결 지향 프로토콜입니다 응용 프로그램 계층이므로 오류가 발생하지 않으면 메시지가 수신되었다고 가정 할 수 있습니다. 메시지를 보내기 전에 메시지가 수신되는지 여부를 알 수는 없지만 연결이 작동 중이면 메시지가 작동한다고 가정 할 수 있습니다.
예, TCP/IP 연결입니다. 문제는 메시지가 전달 된 것처럼 보이지만 오류가 발생하지 않는다는 것입니다. 입/출력 스트림과 소켓 자체는 닫히지 않습니다. 이 상황은 TCP "messages"가 승인되지 않은 시간 제한 – justasd
전에 클라이언트가 인터넷 연결을 끊을 때 발생합니다. 개별 패킷은 ACK를받습니다. –
@SteveC 죄송합니다. 당신 말이 맞습니다!, 고쳐주십시오. –
- 1. 클라이언트가 서버로부터 메시지를 수신했는지 확인하십시오.
- 2. 비동기 소켓 클라이언트가 수신
- 3. Java 클라이언트가 Android에서 Mosquitto로부터 메시지를 수신 할 수 없습니다.
- 4. 클라이언트 (android)가 서버로부터 메시지를 수신합니다. (java)
- 5. 소켓 클라이언트가 계속 연결되어 있는지 확인하십시오.
- 6. 안드로이드 소켓 클라이언트가 서버로부터 수신되지 않습니다.
- 7. AsyncTask. Java 서버로부터 수신 할 때의 문제
- 8. 소켓 클라이언트가 메시지를 보내십시오.
- 9. 클라이언트가 생산자 메시지를 수신 확인합니다.
- 10. 하는 클라이언트가 큐에서 메시지를 수신
- 11. JSTL이 서버로부터 데이터를 수신 할 수 없습니다.
- 12. 모바일 클라이언트가 알림을 수신 할 수있는 소켓 만들기
- 13. java 소켓 클라이언트가 서버로 전송하지만 수신 대기하지 않습니다.
- 14. 클라이언트가 BROADCAST UDP 서버에서 메시지를 수신 할 수 없습니다. (Winsock)
- 15. TcpListener에 연결된 클라이언트가 있는지 확인하십시오.
- 16. 서버로부터 손상된 정보 수신
- 17. Java : 클라이언트가 수신 한 문자열을 인쇄 할 수 없습니다.
- 18. 클라이언트가 다른 클라이언트로부터 메시지를 수신 할 때 연결이 끊어졌습니다.
- 19. 소켓 수신 중지 수신 허용
- 20. 서버 측에서 데이터를 수신 할 수 없음 (Java 소켓 프로그래밍)
- 21. 클라이언트가 서버에서 정보를 수신 할 수 없습니다.
- 22. 클라이언트가 OwnCloud 서버에 연결되어 있는지 확인하십시오.
- 23. 안드로이드 - 들어오는 TCP/소켓 메시지를 백그라운드로 들으십시오.
- 24. 모든 장치에서 서버로부터 업데이트 수신
- 25. rewritecond를 사용하여 스크립트 또는 클라이언트가 있는지 확인하십시오.
- 26. 이미지를로드 할 수 있는지 확인하십시오.
- 27. NServiceBus 메시지를 수신 할 수 없습니다.
- 28. 기기 재구성 후 GCM 서버로부터 알림을 수신 할 수 없습니다.
- 29. SQL Server 클라이언트가 설치되어 있는지 확인하십시오.
- 30. 내 C++ ActiveMQ 클라이언트가 메시지를 보낼 수는 있지만 메시지를 수신 할 수 없음
메시지가 TCP/IP를 통해 완벽하게 전달되었는지 여부를 알아야 할 경우 클라이언트에서 일종의 ACK 메시지를 다시 보내야합니다. –
예를 들어,이 ACK 메시지는 메시지가 전송 된 시간 일 수 있습니다. 클라이언트가 메시지를 수신하면 동일한 시간 메시지를 서버로 보내고이 방법으로 서버는 메시지가 수신되었음을 알게됩니다. 문제는 클라이언트를 쉽게 수정할 수 없다는 것입니다. – justasd