๐Ÿ“Œ Java ์†Œ์ผ“(Socket) ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐœ๋… ๋ฐ ํ™œ์šฉ

My Pale Blue Dotยท2025๋…„ 3์›” 18์ผ
0

JAVA

๋ชฉ๋ก ๋ณด๊ธฐ
26/35
post-thumbnail

๐Ÿ“… ์ž‘์„ฑ์ผ: 2025-03-18

๐Ÿ“ 1. ์†Œ์ผ“(Socket) ๊ฐœ๋…

์†Œ์ผ“(Socket)์ด๋ž€ ๋„คํŠธ์›Œํฌ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์†ก์ˆ˜์‹ ํ•˜๊ธฐ ์œ„ํ•œ ์—”๋“œํฌ์ธํŠธ(EndPoint)์ด๋‹ค.
์ฆ‰, ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ†ต์‹ ํ•˜๋Š” ์ฐฝ๊ตฌ ์—ญํ• ์„ ํ•˜๋ฉฐ,
TCP/IP ๋˜๋Š” UDP ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š”๋‹ค.


โœ… 2. ์†Œ์ผ“์˜ ์ฃผ์š” ๊ฐœ๋…

๊ฐœ๋…์„ค๋ช…
์„œ๋ฒ„(Server)ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‘๋‹ต์„ ๋ณด๋‚ด๋Š” ์—ญํ• 
ํด๋ผ์ด์–ธํŠธ(Client)์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์‘๋‹ต์„ ๋ฐ›๋Š” ์—ญํ• 
ํฌํŠธ(Port)๋„คํŠธ์›Œํฌ์—์„œ ํŠน์ • ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ฒˆํ˜ธ (0~65535)
IP ์ฃผ์†Œ๋„คํŠธ์›Œํฌ์—์„œ ์žฅ์น˜๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ์ฃผ์†Œ (IPv4: 192.168.0.1)
TCP (Transmission Control Protocol)์‹ ๋ขฐ์„ฑ์ด ๋†’์€ ์—ฐ๊ฒฐ ์ง€ํ–ฅ ํ”„๋กœํ† ์ฝœ
UDP (User Datagram Protocol)์†๋„๊ฐ€ ๋น ๋ฅด์ง€๋งŒ ์‹ ๋ขฐ์„ฑ์ด ๋‚ฎ์€ ๋น„์—ฐ๊ฒฐํ˜• ํ”„๋กœํ† ์ฝœ

โœ… 3. TCP ์†Œ์ผ“๊ณผ UDP ์†Œ์ผ“ ๋น„๊ต

ํŠน์ง•TCPUDP
์—ฐ๊ฒฐ ๋ฐฉ์‹์—ฐ๊ฒฐ ์ง€ํ–ฅ(Connection-Oriented)๋น„์—ฐ๊ฒฐ(Connectionless)
๋ฐ์ดํ„ฐ ์ „์†ก์‹ ๋ขฐ์„ฑ ๋†’์Œ (์ˆœ์„œ ๋ณด์žฅ, ์žฌ์ „์†ก)์‹ ๋ขฐ์„ฑ ๋‚ฎ์Œ (ํŒจํ‚ท ์†์‹ค ๊ฐ€๋Šฅ)
์†๋„์ƒ๋Œ€์ ์œผ๋กœ ๋А๋ฆผ๋งค์šฐ ๋น ๋ฆ„
์‚ฌ์šฉ ์˜ˆ์‹œ์›น ๋ธŒ๋ผ์šฐ์ €(HTTP), ํŒŒ์ผ ์ „์†ก(FTP), ์ด๋ฉ”์ผ(SMTP)์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ, VoIP, ์˜จ๋ผ์ธ ๊ฒŒ์ž„

โœ… 4. Java์—์„œ ์†Œ์ผ“ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

โ–ถ (1) TCP ์†Œ์ผ“ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

TCP ๊ธฐ๋ฐ˜์˜ ์†Œ์ผ“ ํ†ต์‹ ์€ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๊ฐ„์— ์—ฐ๊ฒฐ์„ ๋งบ๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๊ตํ™˜ํ•œ๋‹ค.


๐Ÿ”น (1) TCP ์„œ๋ฒ„ ์ฝ”๋“œ

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

public class TCPServer {
    public static void main(String[] args) {
        try {
            // 1๏ธโƒฃ ์„œ๋ฒ„ ์†Œ์ผ“ ์ƒ์„ฑ (ํฌํŠธ 5000)
            ServerSocket serverSocket = new ServerSocket(5000);
            System.out.println("โœ… ์„œ๋ฒ„๊ฐ€ 5000๋ฒˆ ํฌํŠธ์—์„œ ๋Œ€๊ธฐ ์ค‘...");

            // 2๏ธโƒฃ ํด๋ผ์ด์–ธํŠธ ์ ‘์† ๋Œ€๊ธฐ
            Socket socket = serverSocket.accept();
            System.out.println("๐ŸŽ‰ ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ๋จ: " + socket.getInetAddress());

            // 3๏ธโƒฃ ๋ฐ์ดํ„ฐ ์ž…์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);

            // 4๏ธโƒฃ ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ๋ฉ”์‹œ์ง€ ์ˆ˜์‹  ๋ฐ ์‘๋‹ต
            String message;
            while ((message = in.readLine()) != null) {
                System.out.println("๐Ÿ“ฉ ํด๋ผ์ด์–ธํŠธ: " + message);
                out.println("์„œ๋ฒ„ ์‘๋‹ต: " + message); // ๋ฐ›์€ ๋ฉ”์‹œ์ง€๋ฅผ ๊ทธ๋Œ€๋กœ ์‘๋‹ต
            }

            // 5๏ธโƒฃ ์—ฐ๊ฒฐ ์ข…๋ฃŒ
            socket.close();
            serverSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

๐Ÿ”น (2) TCP ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ

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

public class TCPClient {
    public static void main(String[] args) {
        try {
            // 1๏ธโƒฃ ์„œ๋ฒ„์— ์ ‘์† (localhost, ํฌํŠธ 5000)
            Socket socket = new Socket("localhost", 5000);
            System.out.println("โœ… ์„œ๋ฒ„์— ์—ฐ๊ฒฐ๋จ");

            // 2๏ธโƒฃ ๋ฐ์ดํ„ฐ ์ž…์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
            BufferedReader userInput = new BufferedReader(new InputStreamReader(System.in));

            // 3๏ธโƒฃ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ์„œ๋ฒ„๋กœ ์ „์†ก
            String message;
            while (true) {
                System.out.print("๋ฉ”์‹œ์ง€ ์ž…๋ ฅ: ");
                message = userInput.readLine();
                out.println(message); // ์„œ๋ฒ„๋กœ ์ „์†ก

                if (message.equalsIgnoreCase("exit")) break; // 'exit' ์ž…๋ ฅ ์‹œ ์ข…๋ฃŒ
                
                System.out.println("๐Ÿ“ฉ ์„œ๋ฒ„ ์‘๋‹ต: " + in.readLine()); // ์„œ๋ฒ„ ์‘๋‹ต ์ถœ๋ ฅ
            }

            // 4๏ธโƒฃ ์—ฐ๊ฒฐ ์ข…๋ฃŒ
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

โœ… 5. UDP ์†Œ์ผ“ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

TCP๋Š” ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•˜๋Š” ๋ฐฉ์‹์ด์ง€๋งŒ, UDP๋Š” ๋น„์—ฐ๊ฒฐํ˜• ํ†ต์‹ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์†ก์ˆ˜์‹ ํ•œ๋‹ค.


๐Ÿ”น (1) UDP ์„œ๋ฒ„ ์ฝ”๋“œ

import java.net.*;

public class UDPServer {
    public static void main(String[] args) {
        try {
            // 1๏ธโƒฃ UDP ์†Œ์ผ“ ์ƒ์„ฑ (ํฌํŠธ 4000)
            DatagramSocket socket = new DatagramSocket(4000);
            System.out.println("โœ… UDP ์„œ๋ฒ„๊ฐ€ 4000๋ฒˆ ํฌํŠธ์—์„œ ๋Œ€๊ธฐ ์ค‘...");

            // 2๏ธโƒฃ ๋ฐ์ดํ„ฐ ์ˆ˜์‹ ์„ ์œ„ํ•œ ๋ฒ„ํผ ์ƒ์„ฑ
            byte[] buffer = new byte[1024];
            DatagramPacket packet = new DatagramPacket(buffer, buffer.length);

            // 3๏ธโƒฃ ํด๋ผ์ด์–ธํŠธ์˜ ๋ฐ์ดํ„ฐ ์ˆ˜์‹ 
            socket.receive(packet);
            String receivedData = new String(packet.getData(), 0, packet.getLength());
            System.out.println("๐Ÿ“ฉ ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ๋ฉ”์‹œ์ง€: " + receivedData);

            // 4๏ธโƒฃ ์‘๋‹ต ์ „์†ก
            String response = "์„œ๋ฒ„ ์‘๋‹ต: " + receivedData;
            byte[] responseData = response.getBytes();
            DatagramPacket responsePacket = new DatagramPacket(
                    responseData, responseData.length, packet.getAddress(), packet.getPort()
            );
            socket.send(responsePacket);
            
            // 5๏ธโƒฃ ์†Œ์ผ“ ์ข…๋ฃŒ
            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

๐Ÿ”น (2) UDP ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ

import java.net.*;

public class UDPClient {
    public static void main(String[] args) {
        try {
            // 1๏ธโƒฃ UDP ์†Œ์ผ“ ์ƒ์„ฑ
            DatagramSocket socket = new DatagramSocket();
            InetAddress serverAddress = InetAddress.getByName("localhost");

            // 2๏ธโƒฃ ์„œ๋ฒ„๋กœ ์ „์†กํ•  ๋ฐ์ดํ„ฐ ์ƒ์„ฑ
            String message = "Hello, UDP Server!";
            byte[] buffer = message.getBytes();
            DatagramPacket packet = new DatagramPacket(buffer, buffer.length, serverAddress, 4000);

            // 3๏ธโƒฃ ๋ฐ์ดํ„ฐ ์ „์†ก
            socket.send(packet);
            System.out.println("โœ… ๋ฉ”์‹œ์ง€ ์ „์†ก ์™„๋ฃŒ");

            // 4๏ธโƒฃ ์„œ๋ฒ„ ์‘๋‹ต ์ˆ˜์‹ 
            byte[] responseBuffer = new byte[1024];
            DatagramPacket responsePacket = new DatagramPacket(responseBuffer, responseBuffer.length);
            socket.receive(responsePacket);
            String response = new String(responsePacket.getData(), 0, responsePacket.getLength());
            System.out.println("๐Ÿ“ฉ ์„œ๋ฒ„ ์‘๋‹ต: " + response);

            // 5๏ธโƒฃ ์†Œ์ผ“ ์ข…๋ฃŒ
            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

๐Ÿ”ฅ 6. ์ •๋ฆฌ

โœ… ์†Œ์ผ“(Socket)์ด๋ž€? ๋„คํŠธ์›Œํฌ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์†ก์ˆ˜์‹ ํ•˜๋Š” ์ฐฝ๊ตฌ ์—ญํ• 
โœ… TCP ๊ธฐ๋ฐ˜์˜ ์†Œ์ผ“ ํ”„๋กœ๊ทธ๋ž˜๋ฐ
โœ… ํด๋ผ์ด์–ธํŠธ๋Š” Socket์„ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ฒ„์— ์ ‘์†
โœ… InputStream / OutputStream์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์†ก์ˆ˜์‹ 
โœ… ํด๋ผ์ด์–ธํŠธ๊ฐ€ "exit"๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์—ฐ๊ฒฐ ์ข…๋ฃŒ

profile
Here, My Pale Blue.๐ŸŒ

0๊ฐœ์˜ ๋Œ“๊ธ€