inflearn logo
강의

Course

Instructor

Kim Young-han's Practical Java - Advanced Part 2, I/O, Network, Reflection

Network Programming 6 - Resource Cleanup 4

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

Resolved

409

Kelly

1 asked

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);
        }
    }
}

 

 


java 네트워크 객체지향

Answer 1

5

hoonseung

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

0

Kelly

아 그럴수가 있군요,

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

1

Kelly

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

RequestHandler 버전 간 process() 파라미터 차이 질문

0

69

2

리플렉션 default

0

51

1

그럼 SOURCE나 CLASS는 어떤 경우에 사용하나요?

0

75

2

네트워크 프로그램 자원종료 Socket 정리 시 closed 사용 문의

0

99

2

FileInputStream의 transferTo 사용 시 Buffer 문의

0

63

1

오타 제보 드립니다

0

73

2

강좌 복습 팁이 있으신 분들 공유해주시면 감사하겠습니다.

0

104

1

16강 질문있습니다.

0

48

1

한글이 깨질 떄 어떻게 해야 하나요?

0

78

1

자원 정리시 에러가 발생 했을 때 메모리 상황 및 실무에서 로그 확인 방법

0

90

1

인텔리제이에서 네모(스탑버튼) 누르는 것의 의미

-1

66

1

강의 섹션 8: 네드워크 -프로그램 3부분 10:45 오타?

0

86

2

제대로 이해한게 맞나 궁금합니다

0

77

1

File,Files 강의 2번쨰 Files 07:30 에 tmep 파일들을 다 지운건가요 ?

0

61

1

/.well-known/appspecific/com.chrome.devtools.json 에러에 대해서

0

614

1

Socket 자원을 정리할때 stream 을 정리하지 않는 이유가 궁금합니다.

0

89

1

클라이언트 강제종료시 오류 메세지

0

106

2

고급 2편에는 퀴즈가 없네요?

0

97

1

55. 네트워크 프로그램5 - 자원정리2 질문

0

67

1

클라이언트가 FIN과 함께 보내는 ACK는 무엇에 대한건가요?

1

105

2

BufferedInputStream이 1바이트씩 조회해도 성능이 좋은 이유

0

79

1

오타제보

0

59

2

문자 집합 호환성 여부를 판단할 때

0

51

1

utf-8, char

0

51

1