Java.Net.SocketException 수정: Java에서 연결 재설정
-
Java의
java.net.SocketException
-
Java에서
java.net.SocketException: 연결 재설정
의 원인 -
Java에서
java.net.SocketException: 연결 재설정
오류를 재현하고 원인을 식별합니다. -
Java에서
java.net.SocketException: 연결 재설정
오류 수정
오늘의 기사에서는 Java에서 발생할 수 있는 java.net.SocketException: 연결 재설정
오류의 원인과 해결 방법에 대해 설명합니다. 마지막으로 Java의 java.net.SocketException: 연결 재설정
오류를 제거하는 방법을 살펴보겠습니다.
Java의 java.net.SocketException
SocketException
은 IOException
의 하위 클래스입니다. 확인된 예외 상태가 보장됩니다.
소켓을 열거나 액세스하려고 할 때 발생할 수 있는 가장 일반적인 예외는 문제가 있음을 나타냅니다. 서버 쪽을 보면 다음과 같은 오류가 발생합니다.
java.net.SocketException : Connection reset
Java에서 java.net.SocketException: 연결 재설정
의 원인
응답이 소켓을 통해 다시 전송되기 전에 클라이언트가 소켓에 대한 연결을 종료하면 서버에서 java.net.SocketException: 연결 재설정
이 발생합니다. 서버에서 응답을 가져오기 전에 브라우저를 닫는다고 가정해 보겠습니다.
TCP RST 패킷은 마지막 TCP 패킷이 전송된 연결이 승인되지 않았음을 알리는 원격 측의 방법입니다. 연결 재설정
은 TCP RST가 성공적으로 수신되었음을 나타냅니다.
연결이 더 이상 활성 상태가 아니기 때문일 수 있습니다. 결국 포트가 닫히거나 다른 이유로.
재설정 패킷의 간단한 정의에는 내용이 없으며 TCP 헤더 플래그에 RST 비트가 설정되어 있습니다. 다음은 java.net.SocketException: 연결 재설정
오류가 발생할 수 있는 몇 가지 이유입니다.
- 원격 시스템에서
닫기
명령을 받은 결과 TCP 소켓이 닫혔습니다. - 이는 또한 서버에서 대기 중인 많은 양의 요청으로 인해 발생할 수 있으며 이로 인해 클라이언트가 보기 전에 요청이 시간 초과됩니다. 또한 서버의 상태와 로그를 확인하여 과부하가 발생했는지 확인할 수 있습니다.
- 소켓 수신 버퍼에서 읽지 않은 데이터가 있는 소켓을 닫으면 이 오류가 발생할 수도 있습니다.
- 연결이 다른 쪽 끝에서 의도적으로 재설정되었습니다. 이것은 애플리케이션 소프트웨어에는 드물고 부적절하지만 상업용 소프트웨어는 드문 일이 아닙니다.
- 애플리케이션 프로토콜이 올바르지 않거나 완료되기 전에 종료된 연결에 쓰기를 시도했습니다.
Java에서 java.net.SocketException: 연결 재설정
오류를 재현하고 원인을 식별합니다.
예제 코드(Server.java
파일):
package com.demobrokenpipe;
import java.io.*;
import java.net.*;
public class Server {
public static void main(String[] args) throws Exception {
ServerSocket socket = new ServerSocket(6666);
System.out.println("The Server Is Initialized");
Socket conn = socket.accept();
System.out.println("A Request Is Received");
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
System.exit(1);
conn.close();
}
}
예제 코드(Client.java
파일):
package com.demobrokenpipe;
import java.io.*;
import java.net.*;
public class Client {
public static void main(String argv[]) throws Exception {
Socket socket = new Socket("localhost", 6666);
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.write("Hi");
System.out.println("Incorrect String");
BufferedReader bufferReader =
new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println(bufferReader.read());
}
}
여기에는 Server.java
및 Client.java
라는 두 개의 클래스가 있으며 포트 번호 6666
에 연결됩니다. 두 개의 터미널을 열고 두 파일을 모두 실행하여 클라이언트와 서버 간의 통신을 수행하지만 다음과 같이 메시지와 오류를 인쇄합니다.
오류 설명:
Incorrect String
Exception in thread "main" java.net.SocketException: Connection reset
이 오류의 원인이 되는 Socket
, SocketException
, SocketException: Connectin reset
을 통해 오류를 이해해 봅시다.
우리는 동일한 네트워크를 사용하여 서로 통신하기 위해 두 개 이상의 프로그램에서 성공적인 연결을 만들기 위해 소켓을 사용합니다. 우리의 경우 Client.java
와 Server.java
라는 두 개의 프로그램이 있습니다.
소켓
을 사용하여 네트워크 프로토콜 스택을 통해 통신하고 프로그램이 동일한 네트워크에서 메시지를 공유할 수 있는 인터페이스를 얻습니다.
간단히 말해서 소켓
은 네트워크를 통한 통신의 끝점이라고 말할 수 있습니다. 일반적으로 소켓 서버는 여러 클라이언트가 보낸 소켓 연결 요청을 수락할 수 있는 다중 스레드입니다.
SocketException
은 IOException
의 하위 클래스이므로 확인된 예외입니다. 소켓에 액세스하거나 열려고 할 때 발생합니다. SocketException
오류에 대한 전체 예외 계층 구조를 살펴보십시오.
전체 예외 계층:
클라이언트가 소켓 연결을 닫을 때마다 해당 소켓을 통해 응답이 아직 반환되지 않았기 때문에 서버 측에서 SocketException
이 발생합니다. 예, 맞습니다.
응답을 완전히 받기 전에 클라이언트가 소켓 연결을 닫으면 서버 측에서 java.net.SocketException: 연결 재설정
오류가 발생합니다.
여기서 연결 재설정
은 원격 엔드포인트가 마지막 TCP 패킷이 전송된 연결이 인식되지 않음을 알리는 것을 의미합니다. 여기에는 여러 가지 이유가 있을 수 있습니다.
아래에서 찾아봅시다.
-
응답을 완전히 받기 전에 사용자가 웹 브라우저를 닫습니다.
-
가장 일반적으로 작성하려는 연결이 정상적으로 닫혔습니다. 애플리케이션 프로토콜 오류가 있다고 말할 수도 있습니다.
-
또 다른 가능성은 필요한 포트가 더 이상 열려 있지 않다는 것입니다. 또한 읽지 않은 데이터가 소켓 수신 버퍼에 있는 동안 클라이언트가 소켓을 닫을 때도 이 오류가 표시됩니다.
-
Windows 사용자인 경우
소프트웨어로 인해 연결이 중단됨
으로 표시될 수 있습니다. 초보자는연결 재설정
과 혼동합니다.둘 다 동일하지 않다는 것을 기억하십시오. “소프트웨어로 인해 연결이 중단되었습니다"는 우리 쪽에서 전송하는 동안 일부 네트워크 문제가 있을 때 발생합니다.
-
또 다른 상황은
0
보다 커야 하는 시간 초과 값을 전달하여SO_TIMEOUT
옵션을 활성화/비활성화하는setSoTimeout()
이라는 JavaSocket
메서드를 사용하는 것입니다.0
을 전달하면SocketException: 연결 재설정
오류가 발생하는 이유이기도 합니다.
이제 요점은 Client.java
파일의 연결도 닫는다는 것입니다. 아래에서 찾아보자.
Java에서 java.net.SocketException: 연결 재설정
오류 수정
서버에 연결하는 동안 클라이언트로서 이 오류가 발생하면 다음 중 하나를 수행하여 이 오류를 해결할 수 있습니다.
- 서버가 호스트 포트에서 텔넷을 통해 실행되는지 확인합니다. 이 포트는 서버가 실행되는 곳입니다.
- 서버가 다시 시작되었는지 확인합니다.
- 동일한 서버가 다른 호스트로 장애 조치되는지 평가합니다.
또한 이전 섹션에서 설명한 이유를 극복하면 솔루션으로 이동할 수 있습니다. 우리의 경우 System.exit(1)
을 제거하면 시스템을 종료하고 프로그램을 종료하므로 오류가 수정되었습니다.
예제 코드(Server.java
파일):
import java.io.*;
import java.net.*;
public class Server {
public static void main(String[] args) throws Exception {
ServerSocket socket = new ServerSocket(6666);
System.out.println("The Server Is Initialized");
Socket conn = socket.accept();
System.out.println("A Request Is Received");
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
System.out.println(reader.readLine());
conn.close();
}
}
예제 코드(Client.java
파일):
import java.io.*;
import java.net.*;
public class Client {
public static void main(String argv[]) throws Exception {
Socket socket = new Socket("localhost", 6666);
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.write("Hi");
System.out.println("Incorrect String");
BufferedReader bufferReader =
new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println(bufferReader.read());
}
}
I have been working as a Flutter app developer for a year now. Firebase and SQLite have been crucial in the development of my android apps. I have experience with C#, Windows Form Based C#, C, Java, PHP on WampServer, and HTML/CSS on MYSQL, and I have authored articles on their theory and issue solving. I'm a senior in an undergraduate program for a bachelor's degree in Information Technology.
LinkedIn