[java] 소켓의 연결 시간과 읽기 시간 초과의 차이점은 무엇입니까?

3 가지 질문 :

  1. 소켓의 연결 시간 과 읽기 시간 초과 의 차이점은 무엇입니까 ?

  2. 연결 시간 초과가 “무한대”로 설정된 것은 무엇입니까 ? 어떤 상황에서 무한 루프에 남아있을 수 있습니까? 그리고 무한 루프가 죽는 원인은 무엇입니까?

  3. 읽기 시간 초과가 “무한대”로 설정된 것은 무엇을 의미합니까? 어떤 상황에서 무한 루프에 남아있을 수 있습니까? 그리고 무한 루프가 죽는 원인은 무엇입니까?



답변

1) 소켓의 연결 시간과 읽기 시간 초과의 차이점은 무엇입니까?

연결 시간 초과는 초기 연결을 만드는 시간 초과입니다. 즉, TCP 연결 핸드 셰이크 완료. 읽기 시간 초과는 데이터 1 을 읽기 위해 대기하는 시간 초과입니다 . 특히, 서버가 마지막 바이트 이후 <timeout> 초 동안 바이트를 보내지 못하면 읽기 시간 초과 오류가 발생합니다.

2) 연결 시간 초과가 “무한대”로 설정된 것은 무엇을 의미합니까? 어떤 상황에서 무한 루프에 남아있을 수 있습니까? 그리고 무한 루프가 죽는 원인은 무엇입니까?

연결 시도가 영원히 차단 될 수 있음을 의미합니다. 무한 루프는 없지만 소켓을 닫는 다른 스레드가 연결 시도를 차단 해제 할 수 있습니다. ( Thread.interrupt()전화가 트릭을 수행 할 수도 있습니다 … 잘 모르겠습니다.)

3) 읽기 시간 초과가 “무한대”로 설정된 것은 무엇을 의미합니까? 어떤 상황에서 무한 루프에 남아있을 수 있습니까? 무한 루프가 끝나는 원인은 무엇입니까?

read소켓 스트림에 대한 호출이 영원히 차단 될 수 있음을 의미합니다 . 다시 한 번 무한 루프는 없지만 호출에 read의해 차단을 해제 Thread.interrupt()하고 소켓을 닫고 다른 쪽 끝은 데이터를 보내거나 연결을 닫을 수 있습니다.


1-한 의견자가 생각한 것처럼 … 소켓을 열거 나 유휴 할 수있는 시간에 대한 시간 초과는 아닙니다.


답변

이는 TCP 연결 설정 및 소켓에서 데이터 읽기를 대기하기 위해 JVM에서 시행하는 시간 종료 값입니다.

값이 무한대로 설정되면 영원히 기다리지 않습니다. 이는 JVM에 시간 초과가 없으며 OS가 모든 시간 초과를 담당한다는 것을 의미합니다. 그러나 OS의 시간 초과는 실제로 길 수 있습니다. 느린 네트워크에서 6 분의 시간 초과가 발생했습니다.

소켓의 시간 종료 값을 설정하더라도 원시 코드에서 시간 종료가 발생하면 작동하지 않을 수 있습니다. 방화벽으로 차단 된 호스트에 연결하거나 케이블 스위치를 뽑아 Linux에서 문제를 재현 할 수 있습니다.

TCP 시간 초과를 처리하는 유일한 안전한 방법은 다른 스레드에서 연결 코드를 실행하고 스레드가 너무 오래 걸리면 중단하는 것입니다.


답변