강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của kellyy
kellyy

câu hỏi đã được viết

Kim Young-han's Thực chiến Java - Cao cấp phần 2, I/O, Mạng, Phản xạ

Lập trình mạng 6 - Dọn dẹp tài nguyên 4

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

Đã giải quyết

Viết

·

401

·

Đã chỉnh sửa

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네트워크객체지향

Câu trả lời 1

5

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

Kelly님의 프로필 이미지
Kelly
Người đặt câu hỏi

아 그럴수가 있군요,

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

Kelly님의 프로필 이미지
Kelly
Người đặt câu hỏi

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

Hình ảnh hồ sơ của kellyy
kellyy

câu hỏi đã được viết

Đặt câu hỏi