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

Kelly님의 프로필 이미지
Kelly

작성한 질문수

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

네트워크 프로그램6 - 자원 정리4

ClientV6 코드를 조금 변경해보았는데,,, 질문드립니다.

해결된 질문

작성

·

185

·

수정됨

1

안녕하세요, 영한님

뒤에 있을 채팅 프로그램을 직접 만들어보려다가 난관에 봉착해 질문드립니다.

ClientV6 코드 내의 while문을 Thread에 넣는 작업을 진행하였습니다.

아직 클라이언트에서 입력 값을 넣기 전임에도 불구하고 서버에서 EOFException이 나는데 그 이유를 모르겠습니다.

 

혹시 제가 코드를 잘못 짠 것인지

아님 놓치는 부분이 있는 것인지 한 번 봐주실 수 있나요?

public class ClientV6_1 {
    private static final int PORT = 12345;

    public static void main(String[] args) throws IOException {
        log("클라이언트 시작");

        try (
            Socket socket = new Socket("localhost", PORT);
            DataInputStream input = new DataInputStream(socket.getInputStream());
            DataOutputStream output = new DataOutputStream(socket.getOutputStream());
        ) {
            log("소켓 연결: " + socket);

            new Thread(new ClientHandler(socket), "ClientHandler").start();
        } catch (IOException e) {
            log(e);
        }
    }
}
public class ClientHandler implements Runnable {
    private final Socket socket;
    private final DataInputStream input;
    private final DataOutputStream output;

    public ClientHandler(Socket socket) throws IOException {
        this.socket = socket;
        this.input = new DataInputStream(socket.getInputStream());
        this.output = new DataOutputStream(socket.getOutputStream());
    }

    @Override
    public void run() {
        Scanner scanner = new Scanner(System.in);

        try {
            while (true) {
                System.out.print("전송문자: ");
                String toSend = scanner.nextLine();

                // send
                output.writeUTF(toSend);
                log("client -> server: " + toSend);

                if (toSend.equals("exit")) break;

                // receive
                String received = input.readUTF();
                log("client <- server: " + received);

            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            close(socket);
        }
    }
}

 

 


답변 1

4

안녕하세요 해당 코드만 봤을 때는
클라이언트에서 입력 값을 넣기 전에 바로 EOFException 떴다는 거는
inputStream의 소켓이 바로 닫힌 것 같습니다.
메인 메서드에서 try with resources에 socket 코드가 있어 메인 스레드가 새로운 스레드를 생성하고 넘긴 소켓을 바로 닫아 버린 것 같네요
(try 구문을 다 끝내고)
socket과 자원들은 사용하는 스레드에서 닫아야 될거 같아요
제 생각은 이렇습니다.

Kelly님의 프로필 이미지
Kelly
질문자

아 그럴수가 있군요,

감사합니다 시도해보겠습니다!!!

Kelly님의 프로필 이미지
Kelly
질문자

감사합니다, 무슨 문제인지 정확히 파악하였습니다!

Kelly님의 프로필 이미지
Kelly

작성한 질문수

질문하기