Inflearn brand logo image

인프런 커뮤니티 질문&답변

고원준님의 프로필 이미지
고원준

작성한 질문수

김영한의 실전 자바 - 고급 2편, I/O, 네트워크, 리플렉션

네트워크 예외4 - 강제 종료

SocketException: Connection reset 에러가 뜨지 않습니다

작성

·

466

0

 학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.


1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]

java.net.SocketException: Connection reset

네트워크 예외4- 강제종료 강의 중 위 에러가 뜨질 않습니다.

혹시나 서버에서 close() 호출 후 FIN packet을 보내는 것이 오래걸리나 싶어 Thread.sleep()도 3초에서 5초 가량으로 늘려보기도 했는데, "read = -1" 이라고 콘솔에 뜹니다.

반면, "java.net.SocketException: Broken pipe" 에러는 잘 뜹니다. 무슨 문제인지 잘 모르겠습니다.

답변 3

0

저도 똑같네요

read 할땐 에러가 안나오고 정상적으로 출력되고

write 할땐 예제처럼 Broken pipe 가 터집니다.

자바 버전은 21 쓰는데 자바 버전 11, 17, 21 다 해봤는데 같았구요 OS는 Ubuntu 20.04.6 LTS 사용하고 있어요

 

package network.exception.close.reset;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

import static util.MyLogger.log;

public class ResetCloseServer {

    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(12345);
        Socket socket = serverSocket.accept();
        log("Socket accepted: " + socket);

        socket.close();
        serverSocket.close();
        log("Socket and serverSocket closed");
    }

}

 

 

package network.exception.close.reset;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.SocketException;

import static util.MyLogger.log;

public class ResetCloseClient {

    public static void main(String[] args) throws IOException, InterruptedException {
        Socket socket = new Socket("localhost", 12345);
        log("Socket connected: " + socket);
        InputStream input = socket.getInputStream();
        OutputStream output = socket.getOutputStream();

        // client <- server : FIN
        Thread.sleep(1000); // wait until server calls close();

        // client -> server : PUSH[1]
        output.write(1);

        // client <- server : RST
        Thread.sleep(1000); // waits for RST message sending

        try {
//             java.net.SocketException: Connection reset
            int read = input.read();
            System.out.println("read = " + read);
//
//            output.write(0);
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }

}

저는 서버에 SO_LINGER 옵션을 0으로 설정하니 영한님이 보여주신 에러메시지 유도가 가능했네요.

package network.exception.close.reset;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

import static util.MyLogger.log;

public class ResetCloseServer {

    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(12345);
        Socket socket = serverSocket.accept();
        log("Socket accepted: " + socket);

        socket.setSoLinger(true, 0);

        socket.close();
        serverSocket.close();
        log("Socket and serverSocket closed");
    }

}

0

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 고원준님

OS 버전에 따라서 다른 오류메시지가 나올 수는 있는데요.

도움을 드리기 위해서 사용하시는 OS, 자바 버전을 알려주시고

추가로 실제 동작하는 전체 프로젝트를 ZIP파일로 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.

구글 드라이브 업로드 방법은 다음을 참고해주세요.

https://bit.ly/3fX6ygx


주의: 업로드시 링크에 있는 권한 문제 꼭 확인해주세요


추가로 다음 내용도 코멘트 부탁드립니다.

1. 문제 영역을 실행할 수 있는 방법

2. 문제가 어떻게 나타나는지에 대한 상세한 설명 (오류 화면, 오류 로그 포함)

링크: 공식 서포터즈

링크: 자주하는 질문

감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다. 고원준님.

질문해 주신 네트워크 예외 상황에서 “Connection reset” 에러가 아닌 “read = -1” 메시지가 출력되는 이유는 주로 클라이언트가 서버의 FIN 패킷을 정상적으로 수신하고 연결을 정상 종료하는 경우 발생할 수 있습니다. 이는 네트워크 소켓 연결에서 EOF(End of Stream) 상태를 의미하며, 서버가 더 이상 데이터를 전송하지 않을 때 클라이언트에서 읽을 데이터가 없음을 나타냅니다.

주요 원인 및 해결 방법:

  1. 서버의 close() 호출 타이밍: 클라이언트와 서버 간의 연결 종료 시점에 따라 다르게 작동할 수 있습니다. Thread.sleep() 시간을 적절히 조정하여 서버가 연결을 끊을 수 있도록 충분히 대기합니다. FIN 패킷 전송이 확실히 이루어졌는지 확인하는 것이 중요합니다.

  2. 환경 설정 차이: OS나 JVM 환경에 따라 예외 메시지가 다르게 나타날 수 있습니다. 윈도우 환경에서는 “Connection reset” 대신 EOF로 처리되는 경우도 있습니다. 이를 이해하려면 다양한 테스트 환경에서 검증해 보는 것이 좋습니다.

  3. 기타 문제: 프로그램 로직에 의한 예외 처리 흐름이 서로 다른 데서 나올 수 있는 차이일 수 있습니다. 클라이언트와 서버 코드에서 정확히 어떤 순서로 패킷을 송수신하고 있는지 디버깅해보세요.

이전 강의, 이러한 상황에 관련된 다른 질문과 답변에서 많은 정보를 얻을 수 있습니다. 유사한 문제에 대한 답변 링크는 다음에서 확인하세요:

에러 발생 원인에 대한 올바른 이해가 이루어지면, 네트워크 연결과 관련된 여러 이유로 인해 발생할 수 있는 문제를 효과적으로 해결할 수 있을 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드립니다.

현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏

추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

고원준님의 프로필 이미지
고원준

작성한 질문수

질문하기