소켓에서 읽으려고 할 때 다음과 같은 오류가 발생합니다. 입력 스트림에서
readInt()`를 수행 중인데 이 오류가 발생합니다. 설명서를 읽어보니 연결의 클라이언트 부분이 연결을 닫은 것으로 보입니다. 이 시나리오에서는 제가 서버입니다.
클라이언트 로그 파일에 액세스 할 수 있으며 연결을 닫지 않으며 실제로 로그 파일에 따르면 연결을 닫고 있습니다. 왜 이런 일이 발생하는지 아는 사람이 있나요? 또 무엇을 확인해야 하나요? 임계값에 도달한 로컬 리소스가 있을 때 이런 문제가 발생하나요?
다음 줄이 있습니다:
socket.setSoTimeout(10000);
바로 앞에 readInt()
가 있습니다. 이에 대한 이유가 있지만 (긴 이야기) 궁금한 점이 있는데, 표시된 오류가 발생할 수 있는 상황이 있나요? 내 IDE에서 서버를 실행하고 있는데, 우연히 중단점에 멈춰서서 내 IDE를 그대로 두었는데 내 IDE의 내 로그에 똑같은 오류가 나타나기 시작했습니다.
어쨌든, 그냥 언급하는 것뿐이니 걱정하지 마세요. :-(
몇 가지 원인이 있을 수 있습니다.
상대방이 고의로 연결을 재설정했습니다(여기서는 설명하지 않음). 애플리케이션 소프트웨어가 이 작업을 수행하는 경우는 드물고 일반적으로 올바르지 않지만 상용 소프트웨어의 경우 드물지 않습니다.
더 일반적으로는 상대방이 이미 정상적으로 닫은 연결에 쓰기 때문에 발생합니다. 즉, 애플리케이션 프로토콜 오류입니다.
소켓 수신 버퍼에 읽지 않은 데이터가 있을 때 소켓을 닫아서 발생할 수도 있습니다.
Windows에서 <#39;소프트웨어로 인한 연결 중단>은 <#39;연결 재설정>과 동일하지 않으며, 사용자 측에서 전송하는 네트워크 문제로 인해 발생합니다. 이에 대한 Microsoft 기술 자료 문서가 있습니다.
연결 재설정은 단순히 TCP RST가 수신되었음을 의미합니다. 이는 상대방이 처리할 수 없는 데이터를 수신할 때 발생하며, 그 이유는 여러 가지가 있을 수 있습니다.
가장 간단한 이유는 소켓을 닫은 다음 출력 스트림에 더 많은 데이터를 쓰는 경우입니다. 소켓을 닫는다는 것은 상대방에게 대화가 끝났음을 알리는 것이며, 상대방은 연결을 잊어버릴 수 있습니다. 그럼에도 불구하고 해당 스트림에 더 많은 데이터를 보내면, 상대방은 수신 거부(RST)를 통해 더 이상 수신하지 않음을 알립니다.
다른 경우에는 개입하는 방화벽이나 심지어 원격 호스트 자체가 사용자의 TCP 연결을 '잊어버릴' 수도 있습니다. 이는 장시간 데이터를 보내지 않거나(2시간이 일반적인 시간 초과), 피어가 재부팅되어 활성 연결에 대한 정보를 잃어버린 경우 발생할 수 있습니다. 이렇게 끊긴 연결 중 하나에서 데이터를 전송하면 RST도 발생합니다.
추가 정보에 대한 응답으로 업데이트 :
소켓 타임아웃 예외처리를 자세히 살펴보세요. 이 예외는 소켓 작업이 차단된 상태에서 구성된 시간 제한을 초과하면 발생합니다. 이 예외가 발생해도 소켓 자체의 상태는 변경되지 않지만, 예외 처리기가 소켓을 닫은 후 소켓에 쓰기를 시도하면 연결 재설정 상태가 됩니다. setSoTimeout()
은 다른 스레드에서 소켓을 닫는 것과 같은 더러운 작업을 하지 않고도 영원히 차단될 수 있는 read()
작업에서 벗어날 수 있는 깔끔한 방법을 제공하기 위한 것입니다.
매우 신중하게 전체 추적 검사 합니다.
이것은 저의 경우는 '에서' 객체에는 때문에 그 동안 판독값 클리엔초켓 소켓 연결을 원하는거요 단힌 일부 때문이다. (네트워크 손실됩니다, 방화벽 또는 응용 프로그램 중단 또는 고안되었습니다 닫으십시오)
내가 어렸을 때 나는 attaboy 읽는 이 소켓 객체에는 실제로 재 구축 연결 오류가 발생했습니다.
Socket clientSocket = ServerSocket.accept();
is = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
int readed = is.read(); // WHERE ERROR STARTS !!!
흥미로운 것은 '는' 내 것 '과' 세르베르소켓 클라이언트가 연결될 경우 jave 소켓 연결을 이드리드 () '' 내 자신을 재귀적으로 호출을 아무것도 보내지 않고 문을 닫는다. 이로 인해 무한 루프는 보인다 기술입니까 소켓 연결을 위한 판독값 닫힌 읽을 수 있겠어요. 아래와 같은 항목을 사용할 경우 읽기 위해 작업.
while(true)
{
Receive();
}
그러면 다음과 같은 항목을 stacktrace 가 on and on you get a
java.net.SocketException: Socket is closed
at java.net.ServerSocket.accept(ServerSocket.java:494)
내가 한 것은 그저 내 연결 및 클라이언트 접속 및 갱신 세르베르소켓 닫기와 규칙수신되는 더 기다리고 있습니다.
String Receive() throws Exception
{
try {
int readed = is.read();
....
}catch(Exception e)
{
tryReConnect();
logit(); //etc
}
//...
}
이 리스타브리지스 손실됩니다 클라이언트 소켓 연결을 알 수 없는
private void tryReConnect()
{
try
{
ServerSocket.close();
//empty my old lost connection and let it get by garbage col. immediately
clientSocket=null;
System.gc();
//Wait a new client Socket connection and address this to my local variable
clientSocket= ServerSocket.accept(); // Waiting for another Connection
System.out.println("Connection established...");
}catch (Exception e) {
String message="ReConnect not successful "+e.getMessage();
logit();//etc...
}
}
이렇게 말할 때 이 문제를 갖고 있지만, 그것은 단순히 실수라고 닫기와 거라고 나는 읽기 전에 모든 데이터를 연결. 이 경우 적은 있지만, 그것은 아마도 문장열 반환될 협력했습니다 인해 전체 반응은 버퍼된, 전 단힌 거잖나.
이 경우, 그 이후 더 이상 반환될 것이며, 더 많은 양의 텍스트를 예외는 버퍼입니다 돌아올 수 있었다.
이 감독 확인할 수 있습니다. Url 이 같은 파일 열기 주지하십시오 반드시 닫으십시오 (릴리스에는 연결) 완료되면 완전히 삭제했다.
내가 만약 이 문제가 SOA 시스템, Java 로 작성된. 난 클라이언트와 서버가 모두 서로 다른 물리적 시스템을 실행하는 그들은 협력했습니다 좋아 오랫동안 불쾌한 연결, 해당) 에 나와 있고, t # 39 에서 이상한 거 wasn& 로깅합니다 리셋이나 클라이언트 서버 로그를. # 39, didn& 재시작하기 클라이언트와 서버 모두 문제를 해결할 수 없다. 마지막으로 우리가 발견한 것은 오히려 늘어나고 있는 힙 서버 측에서 전체 따라서 JVM 의 메모리 사용할 수 있습니다. 문제 해결! 참고로 로그에 오토프 모리에로 없었다. 메모리 부족, 그냥 사용하지 않았는지.
Weblogic 는 기본적으로 가장 강력한 공유됨 포로토콜 협상할 수 있다. 세부 내용을 볼 수 있습니다. https://stackoverflow.com/questions/34283829/issues-with-setting-https-protocols-system-property-for-https-connections.
난 또 SSL 로깅하기 식별됩니다 세부 지원 대상 ttls. 당시 이 timerevent TLSv1 사용되는 handshake.< br/>; '-' = ssl 핸드셰이크하는 케이만거 트루스트먼거 verbose -djavax.net.debug 스택할 자바드스커티스데버그 = 액세스:
내가 이 푸시하여 해결됨으로 피쳐보다 아웃하려면 jdk8 호환적 jdk8 로 설정값으로 tlsv1.2. 우리 제품, 또한, 내가 그 해결책을 for Java 를 성공적으로 테스트되었습니다 제한되었거나 JDK7 업그레이드하여 TLSv1.2. 7 내가 예전에는 이 대답: https://stackoverflow.com/questions/39157422/how-to-enable-tls-1-2-in-java-7