java.net 를 참조해 주세요.Socket Exception:접속 리셋
소켓에서 읽으려고 하면 다음 오류가 발생.는 ★★★★★★★★★★★★★★★★★★★★★★★★」readInt()
점에 있어서InputStream
이 에러가 발생하고 있습니다.메뉴얼을 참조하면, 접속의 클라이언트 부분이 접속을 종료했을 가능성이 있습니다.이 시나리오에서는, 내가 서버입니다.
클라이언트 로그 파일에 액세스할 수 있지만 연결이 닫히지 않습니다. 실제로 로그 파일에서는 연결을 닫는 것으로 나타납니다.왜 이런 일이 일어나는지 아는 사람 있나요?또 뭐 확인할 거 있어요?이 문제는 로컬리소스가 임계값에 도달했을 때 발생합니까?
다음 행이 있습니다.
socket.setSoTimeout(10000);
readInt()
이 (긴 이야기)에는 이유가 있습니다만, 단지 궁금할 뿐인데, 이것이 지적된 오류로 이어질 수 있는 상황이 있습니까?서버가 IDE로 동작하고 있는데 마침 IDE가 브레이크 포인트에 고정되어 있었습니다.그 후, IDE의 로그에도 같은 에러가 표시되고 있는 것을 알 수 있었습니다.
어쨌든, 그냥 말하는 것 뿐인데, 그런 속셈은 아니었으면 좋겠네요. :- (
몇 가지 원인이 있을 수 있습니다.
다른 쪽 끝은 의도적으로 연결을 리셋했습니다. 여기서는 설명하지 않겠습니다.애플리케이션 소프트웨어에서 이 작업을 수행하는 경우는 드물고 일반적으로 올바르지 않습니다.그러나 상용 소프트웨어에서는 이 문제가 잘 알려져 있지 않습니다.
일반적으로 다른 한쪽 끝은 이미 정상적으로 닫혀 있는 접속에 쓰기가 원인입니다.즉, 애플리케이션 프로토콜 오류입니다.
또한 소켓 수신 버퍼에 읽지 않은 데이터가 있을 때 소켓을 닫는 것이 원인일 수도 있습니다.
Windows 에서는, 「software caused connection abort」(접속 리셋)와는 다른 「software caused connection abort」(소프트웨어의 원인 접속 중단)은, 유저측으로부터 송신되는 네트워크상의 문제에 의해서 발생합니다.이것에 관한 Microsoft Knowledge Base 의 기사가 있습니다.
접속 리셋은 단순히 TCP RST가 수신되었음을 의미합니다.이 문제는 피어가 처리할 수 없는 데이터를 수신할 때 발생하며 다양한 이유가 있을 수 있습니다.
가장 간단한 방법은 소켓을 닫고 출력 스트림에 더 많은 데이터를 쓰는 것입니다.소켓을 닫으면 피어에 대해 대화가 끝났다고 알립니다.피어는 접속을 잊어버릴 수 있습니다.해당 스트림에 더 많은 데이터를 전송하면 피어는 수신 중이 아님을 알리기 위해 RST를 사용하여 해당 데이터를 거부합니다.
그 외의 경우는, 개입하는 파이어 월(fire wall)이나 리모트호스트 자체가 TCP 접속을 「잊어버리는」 경우가 있습니다.이 문제는 오랫동안 데이터를 전송하지 않거나(2시간이 일반적인 시간 초과) 피어가 재부팅되어 활성 연결에 대한 정보가 손실되었기 때문에 발생할 수 있습니다.이러한 접속 중 하나로 데이터를 송신하면 RST도 발생합니다.
추가 정보에 따라 업데이트:
을 주의 봐 주세요.SocketTimeoutException
이 예외는 소켓 동작으로 차단되어 있는 동안 설정된 타임아웃을 초과하면 발생합니다.이 예외가 발생해도 소켓 자체의 상태는 변경되지 않지만 예외 핸들러가 소켓을 닫고 쓰기를 시도하면 연결 재설정 상태가 됩니다. setSoTimeout()
탈옥할 수 있는 깔끔한 방법을 알려주고 싶어read()
그렇지 않으면 다른 스레드에서 소켓을 닫는 등의 더러운 작업을 하지 않고 영원히 차단될 수 있습니다.
이와 같은 이상한 문제가 발생할 때마다 저는 보통 WirelessShark와 같은 툴을 사용하여 원시 데이터가 서로 주고받는 것을 봅니다.어디서 연결이 끊어지고 읽으려고 할 때만 알림이 뜨는지 놀랄 수 있습니다.
모든 트레이스를 주의 깊게 검사해야 합니다.
java.net.SocketException: Connection reset
discloss.discloss.case.
때 합니다.Socket
네트워크 , 의도된 클로즈(네트워크 손실, 방화벽 또는 애플리케이션 크래시 또는 의도된 클로즈)(네트워크 손실, 방화벽, 애플리케이션 크래시 또는 종료)
실제로 연결을 재정립하고 있을 때 이 Socket 객체를 읽는 중에 오류가 발생했습니다.
Socket clientSocket = ServerSocket.accept();
is = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
int readed = is.read(); // WHERE ERROR STARTS !!!
은 ★★★★★★★★★★★★★★★★★★★★★.for my JAVA Socket
가 나의 「내」에 하고 있는 ServerSocket
것도 보내지 않고 을 끊습니다.is.read()
계속 호출되고 있습니다.이 소켓에서 읽기 위해 닫힌 연결에서 읽으려고 하는 무한 while 루프 상태인 것 같습니다.읽기 조작에 다음과 같은 것을 사용하는 경우,
while(true)
{
Receive();
}
그러면 다음과 같은 stackTrace가 계속 표시됩니다.
java.net.SocketException: Socket is closed
at java.net.ServerSocket.accept(ServerSocket.java:494)
Server Socket을 닫고 접속을 갱신한 후 클라이언트 접속이 추가되기를 기다렸습니다.
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...
}
}
안 에 다른 수 .try and catch
게 된 것 이은 제가 Connection reset
★★★★★★ 。
말하기 부끄럽지만, 이 문제가 발생했을 때, 모든 데이터를 읽기 전에 연결을 끊은 것은 단순한 실수였습니다.작은 문자열이 반환되는 경우는 동작했습니다만, 그것은 아마 제가 닫기 전에 전체 응답이 버퍼링되었기 때문일 것입니다.
반환되는 텍스트의 양이 긴 경우 버퍼가 더 많이 반환되었기 때문에 예외가 느려졌습니다.
당신은 이 실수를 확인할 수 있습니다.URL을 여는 것은 파일과 같기 때문에 완전히 읽힌 후에는 반드시 닫으십시오(연결 해제).
저도 같은 실수를 했어요.나는 지금 문제의 해결책을 찾았다.문제는 서버가 스트림을 읽기 전에 클라이언트 프로그램이 종료되고 있다는 것입니다.
Java로 작성된 SOA 시스템에서 이러한 문제가 발생했습니다.클라이언트와 서버를 모두 다른 물리 머신으로 실행하고 있었습니다만, 장시간 정상적으로 동작하고 있었습니다.그 후, 클라이언트 로그에 접속의 리셋이 표시되어 서버 로그에 이상한 점은 없었습니다.클라이언트와 서버를 모두 재기동해도 문제가 해결되지 않았습니다.마지막으로 서버 측 힙이 다소 꽉 찼다는 것을 알게 되었습니다.그래서 JVM에서 사용할 수 있는 메모리를 늘렸습니다.문제 해결!로그에 Out Of Memory Error는 없습니다.메모리는 부족했을 뿐, 다 써지지 않았습니다.
서버의 Java 버전을 확인합니다.Weblogic 10.3.6이 TLSv1에 있는 JDK 1.7.0_75에 있기 때문에 이 문제가 발생.사용하려고 했던 나머지 엔드포인트는 TLSv1.2보다 낮은 것을 셧다운하고 있었습니다.
기본적으로는 Weblogic은 가장 강력한 공유 프로토콜을 협상하려고 했습니다.자세한 내용은 여기를 참조하십시오. HTTPS 연결을 위한 https.protocols 시스템 속성 설정 관련 문제.
지원되는 TLS를 식별하기 위해 자세한 SSL 로깅을 추가했습니다.이는 핸드쉐이크에 TLSv1이 사용되고 있음을 나타냅니다.
-Djavax.net.debug=ssl:handshake:verbose:keymanager:trustmanager -Djava.security.debug=access:stack
이 문제를 해결하려면 이 기능을 JDK8 호환 제품에 적용하면 JDK8은 기본 TLSv1.2로 설정됩니다.JDK7에 한정되어 있는 경우 TLSv1.2로 업그레이드하여 Java 7의 회피책을 테스트했습니다.나는 다음과 같은 대답을 사용했다.Java 7에서 TLS 1.2를 활성화하는 방법
SSH를 통해 서버에서 명령어를 전송하려고 하는 Java 프로그램에서도 이 문제가 있었습니다.자바 코드를 실행하는 기계에서 문제가 발생했습니다.원격 서버에 연결할 권한이 없습니다.write() 메서드는 정상적으로 동작하고 있었지만 read() 메서드는 java.net을 송신하고 있었습니다.Socket Exception:연결이 리셋되었습니다.리모트 서버의 기존 키에 클라이언트 SSH 키를 추가하여 이 문제를 해결했습니다.
저 같은 경우에는DNS problem
.
넣었다host file
모든 것이 정상적으로 동작합니다.물론 영구적인 해결책은 아닙니다.이것에 의해서, DNS 문제를 해결할 수 있습니다.
제 경험상, 저는 종종 다음과 같은 상황에 직면합니다.
회사에서 근무하는 경우 네트워크 및 보안 팀에 문의하십시오.외부 서비스에 대한 요청에서는 관련 엔드포인트에 대한 권한을 부여해야 할 수 있습니다.
또 다른 문제는 응용 프로그램이 실행 중인 서버에서 SSL 인증서가 만료되었을 수 있다는 것입니다.
난 이 문제를 본 적이 있다.제 경우 특정 Java 클래스에서 동일한 ClientRequest 개체를 재사용하여 오류가 발생했습니다.그 프로젝트는 Jboss Resteasy를 사용하고 있었다.
- 처음에는 특정 URL에서 요청을 수행하기 위해 ClientRequest 오브젝트(클래스의 글로벌 변수로 배치)를 사용하거나 호출하는 메서드는 1개뿐이었습니다.
- 그 후 동일한 ClientRequest 개체를 재사용하여 다른 URL을 사용하여 데이터를 가져오는 다른 메서드가 생성되었습니다.
해결 방법: 같은 클래스에 다른 ClientRequest 개체가 생성되어 단독으로 재사용되지 않습니다.
제 경우 TSL 버전에 문제가 있었습니다.OkHttp 클라이언트에서 Retrofit을 사용하고 있었는데 서버 측에서 ALB를 업데이트한 후 connectionSpecs에서 설정을 삭제해야 합니다.
OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder();
List<ConnectionSpec> connectionSpecs = new ArrayList<>();
connectionSpecs.add(ConnectionSpec.COMPATIBLE_TLS);
// clientBuilder.connectionSpecs(connectionSpecs);
따라서 다른 TSL 설정을 사용하려면 이 설정을 삭제 또는 추가해 보십시오.
언급URL : https://stackoverflow.com/questions/62929/java-net-socketexception-connection-reset
'programing' 카테고리의 다른 글
Vue js가 잘못된 요소 높이를 반환함 (0) | 2022.07.03 |
---|---|
Vue3에 Vuex를 설치하지 못했습니다. (0) | 2022.07.03 |
Vue cli 3 및 IE 11 (0) | 2022.07.03 |
Java 속성 파일 사용 방법 (0) | 2022.07.03 |
GCC 패드는 왜 NOP에서 기능합니까? (0) | 2022.07.03 |