3가지 솔루션이 있습니다:
1 전송할 데이터 길이에 동의합니다. 예를 들어 http의 keepAlive는 이 Content-Length에 의존해야 합니다.
2 타임아웃 시간을 설정합니다. 경험상 소켓 수준에서 설정해야 효과가 있습니다.
다음과 같이 코드를 복사합니다. Socket 소켓 = new Socket(host,port);
소켓.setSoTimeout(100); // 100밀리초 이상 데이터가 없으면 SocketTimeoutException이 발생합니다.
3. 발신자가 데이터 전송을 마친 후 연결을 닫습니다. 이는 HTTP 작업에서 매우 일반적입니다.
(InputStream은 데이터를 읽었는지 어떻게 확인합니까?)
때로는 클라이언트를 수정할 수 없는 경우 첫 번째 상황만 통과되며 두 번째 상황이 차단되면 직접 예외가 발생합니다. 시나리오 3은 전체 통신 프로세스 동안 링크를 중단할 수 없고 끝까지 종료할 수 없기 때문에 긴 연결에는 적합하지 않습니다. 실제로 네 번째 방법이 있습니다. 특정 문자를 읽으면 읽기를 중지합니다. 예를 들어 byebye를 읽으면 중단합니다. 하지만 이를 위해서는 클라이언트 코드도 변경해야 합니다. 나는 절충안을 선택했습니다 - 시간 초과 설정:
StringBuilder sb = new StringBuilder();try { client.setSoTimeout(500); while ((a = client.getInputStream().read(buf)) != -1) { sb.append(new String(buf, 0, a)); if (a != size) { break; } }} catch (예외 e) {}System.out.println(sb);