Java.Net.SocketException 수정: Java에서 연결 재설정

Muhammad Zeeshan 2023년10월12일
  1. Java의 java.net.SocketException
  2. Java에서 java.net.SocketException: 연결 재설정의 원인
  3. Java에서 java.net.SocketException: 연결 재설정 오류를 재현하고 원인을 식별합니다.
  4. Java에서 java.net.SocketException: 연결 재설정 오류 수정
Java.Net.SocketException 수정: Java에서 연결 재설정

오늘의 기사에서는 Java에서 발생할 수 있는 java.net.SocketException: 연결 재설정 오류의 원인과 해결 방법에 대해 설명합니다. 마지막으로 Java의 java.net.SocketException: 연결 재설정 오류를 제거하는 방법을 살펴보겠습니다.

Java의 java.net.SocketException

SocketExceptionIOException의 하위 클래스입니다. 확인된 예외 상태가 보장됩니다.

소켓을 열거나 액세스하려고 할 때 발생할 수 있는 가장 일반적인 예외는 문제가 있음을 나타냅니다. 서버 쪽을 보면 다음과 같은 오류가 발생합니다.

java.net.SocketException : Connection reset

Java에서 java.net.SocketException: 연결 재설정의 원인

응답이 소켓을 통해 다시 전송되기 전에 클라이언트가 소켓에 대한 연결을 종료하면 서버에서 java.net.SocketException: 연결 재설정이 발생합니다. 서버에서 응답을 가져오기 전에 브라우저를 닫는다고 가정해 보겠습니다.

TCP RST 패킷은 마지막 TCP 패킷이 전송된 연결이 승인되지 않았음을 알리는 원격 측의 방법입니다. 연결 재설정은 TCP RST가 성공적으로 수신되었음을 나타냅니다.

연결이 더 이상 활성 상태가 아니기 때문일 수 있습니다. 결국 포트가 닫히거나 다른 이유로.

재설정 패킷의 간단한 정의에는 내용이 없으며 TCP 헤더 플래그에 RST 비트가 설정되어 있습니다. 다음은 java.net.SocketException: 연결 재설정 오류가 발생할 수 있는 몇 가지 이유입니다.

  1. 원격 시스템에서 닫기 명령을 받은 결과 TCP 소켓이 닫혔습니다.
  2. 이는 또한 서버에서 대기 중인 많은 양의 요청으로 인해 발생할 수 있으며 이로 인해 클라이언트가 보기 전에 요청이 시간 초과됩니다. 또한 서버의 상태와 로그를 확인하여 과부하가 발생했는지 확인할 수 있습니다.
  3. 소켓 수신 버퍼에서 읽지 않은 데이터가 있는 소켓을 닫으면 이 오류가 발생할 수도 있습니다.
  4. 연결이 다른 쪽 끝에서 의도적으로 재설정되었습니다. 이것은 애플리케이션 소프트웨어에는 드물고 부적절하지만 상업용 소프트웨어는 드문 일이 아닙니다.
  5. 애플리케이션 프로토콜이 올바르지 않거나 완료되기 전에 종료된 연결에 쓰기를 시도했습니다.

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.javaClient.java라는 두 개의 클래스가 있으며 포트 번호 6666에 연결됩니다. 두 개의 터미널을 열고 두 파일을 모두 실행하여 클라이언트와 서버 간의 통신을 수행하지만 다음과 같이 메시지와 오류를 인쇄합니다.

오류 설명:

Incorrect String
Exception in thread "main" java.net.SocketException: Connection reset

이 오류의 원인이 되는 Socket, SocketException, SocketException: Connectin reset을 통해 오류를 이해해 봅시다.

우리는 동일한 네트워크를 사용하여 서로 통신하기 위해 두 개 이상의 프로그램에서 성공적인 연결을 만들기 위해 소켓을 사용합니다. 우리의 경우 Client.javaServer.java라는 두 개의 프로그램이 있습니다.

소켓을 사용하여 네트워크 프로토콜 스택을 통해 통신하고 프로그램이 동일한 네트워크에서 메시지를 공유할 수 있는 인터페이스를 얻습니다.

간단히 말해서 소켓은 네트워크를 통한 통신의 끝점이라고 말할 수 있습니다. 일반적으로 소켓 서버는 여러 클라이언트가 보낸 소켓 연결 요청을 수락할 수 있는 다중 스레드입니다.

SocketExceptionIOException의 하위 클래스이므로 확인된 예외입니다. 소켓에 액세스하거나 열려고 할 때 발생합니다. SocketException 오류에 대한 전체 예외 계층 구조를 살펴보십시오.

전체 예외 계층:

java에서 Java Net SocketException 연결 재설정 수정 - 예외 계층 구조

클라이언트가 소켓 연결을 닫을 때마다 해당 소켓을 통해 응답이 아직 반환되지 않았기 때문에 서버 측에서 SocketException이 발생합니다. 예, 맞습니다.

응답을 완전히 받기 전에 클라이언트가 소켓 연결을 닫으면 서버 측에서 java.net.SocketException: 연결 재설정 오류가 발생합니다.

여기서 연결 재설정은 원격 엔드포인트가 마지막 TCP 패킷이 전송된 연결이 인식되지 않음을 알리는 것을 의미합니다. 여기에는 여러 가지 이유가 있을 수 있습니다.

아래에서 찾아봅시다.

  1. 응답을 완전히 받기 전에 사용자가 웹 브라우저를 닫습니다.

  2. 가장 일반적으로 작성하려는 연결이 정상적으로 닫혔습니다. 애플리케이션 프로토콜 오류가 있다고 말할 수도 있습니다.

  3. 또 다른 가능성은 필요한 포트가 더 이상 열려 있지 않다는 것입니다. 또한 읽지 않은 데이터가 소켓 수신 버퍼에 있는 동안 클라이언트가 소켓을 닫을 때도 이 오류가 표시됩니다.

  4. Windows 사용자인 경우 소프트웨어로 인해 연결이 중단됨으로 표시될 수 있습니다. 초보자는 연결 재설정과 혼동합니다.

    둘 다 동일하지 않다는 것을 기억하십시오. “소프트웨어로 인해 연결이 중단되었습니다"는 우리 쪽에서 전송하는 동안 일부 네트워크 문제가 있을 때 발생합니다.

  5. 또 다른 상황은 0보다 커야 하는 시간 초과 값을 전달하여 SO_TIMEOUT 옵션을 활성화/비활성화하는 setSoTimeout()이라는 Java Socket 메서드를 사용하는 것입니다. 0을 전달하면 SocketException: 연결 재설정 오류가 발생하는 이유이기도 합니다.

이제 요점은 Client.java 파일의 연결도 닫는다는 것입니다. 아래에서 찾아보자.

Java에서 java.net.SocketException: 연결 재설정 오류 수정

서버에 연결하는 동안 클라이언트로서 이 오류가 발생하면 다음 중 하나를 수행하여 이 오류를 해결할 수 있습니다.

  1. 서버가 호스트 포트에서 텔넷을 통해 실행되는지 확인합니다. 이 포트는 서버가 실행되는 곳입니다.
  2. 서버가 다시 시작되었는지 확인합니다.
  3. 동일한 서버가 다른 호스트로 장애 조치되는지 평가합니다.

또한 이전 섹션에서 설명한 이유를 극복하면 솔루션으로 이동할 수 있습니다. 우리의 경우 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());
  }
}
Muhammad Zeeshan avatar Muhammad Zeeshan avatar

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

관련 문장 - Java Error