package CHAPTER14;

import java.io.*;
import java.net.*;

public class SocketStructureExample {
    public static void main(String[] args) {
        try {
            // 1. 서버 생성 및 포트 바인딩
            System.out.println("[서버] ServerSocket 생성");
            ServerSocket serverSocket = new ServerSocket(5100);

            // 2. 클라이언트 소켓 생성 및 서버 연결 요청
            System.out.println("[클라이언트] 서버에 연결 시도");
            Socket clientSocket = new Socket("localhost", 5100);
            System.out.println("[클라이언트] 서버에 연결됨");

            // 3. 서버가 클라이언트 연결 수락
            Socket serverSideSocket = serverSocket.accept();
            System.out.println("[서버] 클라이언트 연결 수락됨");

            // 4. 서버 측 스트림 생성
            BufferedReader serverIn = new BufferedReader(
                    new InputStreamReader(serverSideSocket.getInputStream()));
            PrintWriter serverOut = new PrintWriter(serverSideSocket.getOutputStream(), true);
            System.out.println("[서버] 입출력 스트림 생성 완료");

            // 5. 클라이언트 측 스트림 생성
            BufferedReader clientIn = new BufferedReader(
                    new InputStreamReader(clientSocket.getInputStream()));
            PrintWriter clientOut = new PrintWriter(clientSocket.getOutputStream(), true);
            System.out.println("[클라이언트] 입출력 스트림 생성 완료");

            // 6. 자원 정리
            serverIn.close();
            serverOut.close();
            serverSideSocket.close();
            serverSocket.close();
            System.out.println("[서버] 자원 정리 완료");

            clientIn.close();
            clientOut.close();
            clientSocket.close();
            System.out.println("[클라이언트] 자원 정리 완료");

        } catch (IOException e) {
            System.out.println("[오류] " + e.getMessage());
        }
    }
}
