java.net.SocketTimeoutException:Read timed out 문제 해결

java.net.SocketTimeoutException: Read timed out
문제 가 발생 한 환경:ssm+mysql+gridFS+tomcat
문제 코드 세그먼트:

public void write(OutputStream os, InputStream is) {
  try (BufferedOutputStream bos = new BufferedOutputStream(os); BufferedInputStream bis = new BufferedInputStream(is)) {
   int count;
   byte[] buffer = new byte[1024];
   while ((count = bis.read(buffer)) > 0) {
    bos.write(buffer, 0, count);
   }
   os.flush();
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
그 중에서 출력 흐름 은 response.getOutPutStream()을 사용 합 니 다.
문제 의 원인:
mongodb 와 프로젝트 가 서로 다른 서버 에 배치 되 어 있 기 때문에 큰 파일 을 읽 는 데 시간 이 오래 걸 리 고 tomcat 가 제한 하 는 연결 의 생존 시간 을 초과 하여 tomcat 가 연결 시간 이 초과 되 었 음 을 판단 합 니 다.
해결 방안:
tomcat 에서 server.xml 를 수정 합 니 다.설정 은 다음 과 같 습 니 다.

<Connector executor="tomcatThreadPool"
               port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000" disableUploadTimeout="false"
               redirectPort="8443" />
disableUploadTimeout="false"를 추가 하고 읽 기와 쓰기 연결 시간 초과 설정 을 취소 합 니 다.
혹은

<Connector executor="tomcatThreadPool"
               port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
    keepAliveTimeout="100000"
               redirectPort="8443" />
keepAliveTimeout="100000"증가,연결 생존 시간 증가
SocketException 흔 한 이상
첫 번 째 이상 은 java.net.BidException:Address already in use:JVMBind
이 이상 은 서버 에서 new ServerSocket(port)(port 는 0,65536 의 전체 값)작업 을 할 때 발생 합 니 다.이상 한 이 유 는 port 와 같은 포트 가 시작 되 었 다 고 생각 하고 감청 하기 때문이다.이 때 netstat Can 명령 을 사용 하면 Listending 상태의 포트 를 볼 수 있 습 니 다.점용 되 지 않 은 포트 만 찾 으 면 이 문 제 를 해결 할 수 있다.
두 번 째 이상 은 java.net.Connect Exception:Connection refused:connect 입 니 다.
이 이상 은 클 라 이언 트 가 new Socket(ip,port)작업 을 할 때 발생 합 니 다.이 이상 이 발생 하 는 원인 은 ip 주소 가 있 는 기 계 를 찾 을 수 없 거나(즉,현재 기기 에서 지정 한 ip 경로 가 존재 하지 않 음)이 ip 이 존재 하지만 지정 한 포트 를 찾 을 수 없습니다.이 문제 가 발생 하면 먼저 클 라 이언 트 의 ip 와 port 가 잘못 썼 는 지 확인 하고 정확 하 다 면 클 라 이언 트 ping 에서 서버 가 ping 통 할 수 있 는 지 확인 하 십시오.ping 통(서비스 서버 에서 ping 을 차단 하려 면 다른 방법 이 필요 합 니 다)이 가능 하 다 면 서버 에서 지정 한 포트 를 감청 하 는 프로그램 이 시작 되 는 지 여 부 를 보면 이 문 제 를 해결 할 수 있 습 니 다.
ConnectException:Connection refused:이 이상 은 클 라 이언 트 다 중 스 레 드 에 접근 할 때 도 나타 납 니 다.
세 번 째 이상 은 java.net.Socket Exception:Socket is closed 입 니 다.
이 이상 은 클 라 이언 트 와 서버 에서 발생 할 수 있 습 니 다.이상 한 이 유 는 우리 측 이 자발적으로 연결 을 닫 은 후(Socket 의 close 방법 을 호출)네트워크 연결 에 대해 읽 기와 쓰기 작업 을 하기 때 문 입 니 다.
네 번 째 이상 은 java.net.SocketException:(Connection reset 또는 Connect reset by peer:Socket write error)
이 이상 은 클 라 이언 트 와 서버 에서 모두 발생 할 수 있 습 니 다.이 이상 을 일 으 키 는 원인 은 두 가지 가 있 습 니 다.첫 번 째 는 한 쪽 의 Socket 이 닫 히 거나 주동 적 으로 닫 히 거나 이상 한 종료 로 인 한 닫 히 면 다른 한 쪽 은 데 이 터 를 보 내 고 첫 번 째 패 킷 은 이 이상 을 일 으 키 는 것 입 니 다(Connect reset by peer).다른 하 나 는 한 쪽 이 종료 되 었 으 나 종료 할 때 이 연결 을 닫 지 않 았 습 니 다.다른 한 쪽 은 연결 에서 데 이 터 를 읽 으 면 이 이상(Connection reset)을 던 집 니 다.쉽게 말 하면 연결 이 끊 긴 후의 읽 기와 쓰기 동작 으로 인 한 것 이다.
다섯 번 째 이상 은 java.net.SocketException:Broken pipe 입 니 다.
이 이상 은 클 라 이언 트 와 서버 에서 모두 발생 할 수 있 습 니 다.네 번 째 이상 의 첫 번 째 상황 에서(즉,SocketExcepton:Connect reset by peer:Socket write error 를 던 진 후)데 이 터 를 계속 쓰 면 이 이상 을 던 집 니 다.앞의 두 가지 이상 한 해결 방법 은 프로그램 이 종료 되 기 전에 모든 네트워크 연결 을 닫 는 것 을 확보 하 는 것 이 고,그 다음 에 상대방 의 연결 닫 기 동작 을 검사 해 야 하 며,상대방 이 연결 을 닫 은 것 을 발견 한 후에 자신 도 이 연결 을 닫 아야 한다.
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기