소켓 socket

📞 TCP 프로토콜

☕ TCPServer.java

public class TCPServer {

    //  💡 내 컴퓨터를 의미하는 IP주소
    //  - 일반적으로 localhost로 매핑
    public static final String SERVER_IP = "127.0.0.1";

    //  IP가 아파트 주소라면 포트는 게이트 번호
    public static final int PORT_NO = 1234;
    public static void main(String[] args) {

        try (
                //  💡 ServerSocket
                //  - 클라이언트(들)로부터 요청을 받기 위한 소켓
                //  - 연결을 받아 Socket 인스턴스 반환
                ServerSocket serverSkt = new ServerSocket(PORT_NO)
        ) {
            while (true) {
                try (
                        //  💡 Socket : 클라이언트로부터 요청이 오면 반환되는 소켓
                        Socket clientSkt = serverSkt.accept();

                        //  💡 클라이언트로부터 받을 스트림
                        InputStream is = clientSkt.getInputStream();
                        InputStreamReader isr = new InputStreamReader(is);
                        BufferedReader br = new BufferedReader(isr);
                        StringWriter sw = new StringWriter();
                        PrintWriter piw = new PrintWriter(sw);

                        //  💡 클라이언트에게 보낼 스트림
                        OutputStream os = clientSkt.getOutputStream();
                        //  💡 두 번째 인자 : autoflush
                        //  - 값이 프린트 될 때마다 바로 스트림으로 출력할지 여부
                        PrintWriter pow = new PrintWriter(os, true);
                ) {
                    String line;
                    int lineCount = 1;
                    while ((line = br.readLine()) != null) {
                        piw.printf(
                                "%3d :  %s%n".formatted(
                                        lineCount++, line
                                )
                        );
                        //  💡 클라이언트에게 되돌려보낼 메시지
                        pow.printf("✅ 수신: %s... 등 %d자%n".formatted(
                                line.substring(
                                        0, Math.min(3, line.length())

                                ), line.length()
                        ));
                    }
                    System.out.println(sw);
                }
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
       }
    }
}

☕ TCPClient.java

public class TCPClient {

    public static String lyric = "" +
            "검푸른 파도속으로 눈물을 묻었지\\n" +
            "바위산 계곡을 따라 외로움 잊었지\\n" +
            "강한것은 아름다워 타오르는 태양처럼\\n" +
            "강한것은 아름다워 변함없는 바위처럼\\n" +
            "불타는 노을 보면서 고개를 들었지\\n" +
            "눈물의 세월 모두다 저 멀리 던졌지\\n" +
            "강한것은 아름다워 타오르는 태양처럼\\n" +
            "강한것은 아름다워 변함없는 바위처럼\\n" +
            "외인구단 외인구단 태양 이어라\\n" +
            "외인구단 외인구단 바위 되어라";
    public static void main(String[] args) {

        try (
                //  💡 서버 연결에 사용할 소켓
                Socket socket = new Socket(SERVER_IP, PORT_NO);

                //  💡 서버로 보낼 스트림
                OutputStream os = socket.getOutputStream();
                PrintWriter pw = new PrintWriter(os, true); // ⭐️ autoflush

                InputStream is = socket.getInputStream();
                InputStreamReader isr = new InputStreamReader(is);
                BufferedReader br = new BufferedReader(isr);
        ) {
            for (String line : lyric.split("\\n")) {
                pw.println(line);
                System.out.println(br.readLine());
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }
}

📦 UDP 프로토콜