๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๊ฐœ์ธ ๊ณต๋ถ€/Java, Python

[Java] Java TCP socket programming

by syLim___ 2023. 9. 19.
728x90

โœ… ์†Œ์ผ“ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ž€?

 - ํ”„๋กœ์„ธ์Šค ๊ฐ„์˜ ํ†ต์‹ ์— ์‚ฌ์šฉ๋˜๋Š” ์–‘ ๋๋‹จ(endpoint)์ธ ์†Œ์ผ“์„ ์ด์šฉํ•œ ํ†ต์‹  ํ”„๋กœ๊ทธ๋ž˜๋ฐ

 

 - ํ”„๋กœ์„ธ์Šค๋ผ๋ฆฌ๋Š” ํ†ต์‹ ์„ ํ•  ๋•Œ, ๊ฐ ํ”„๋กœ์„ธ์Šค์˜ ์†Œ์ผ“๋ผ๋ฆฌ ์—ฐ๊ฒฐํ•˜๊ณ , ์†Œ์ผ“์„ ํ†ตํ•ด ํ†ต์‹ ํ•œ๋‹ค.

 - ์†Œ์ผ“๋ผ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ์—ฐ๊ฒฐํ†ต๋กœ๋Š” ์ž…๋ ฅ์ŠคํŠธ๋ฆผ๊ณผ ์ถœ๋ ฅ์ŠคํŠธ๋ฆผ์ด๋‹ค.

 - ํ†ต์‹ ํ•˜๋Š” ๋‘ ์†Œ์ผ“์˜ ์ž…์ถœ๋ ฅ์ŠคํŠธ๋ฆผ์€ ๊ต์ฐจ ์—ฐ๊ฒฐ๋˜์–ด, ํ•œ์ชฝ ์†Œ์ผ“์˜ ์ถœ๋ ฅ์ด ๋‹ค๋ฅธ์ชฝ ์†Œ์ผ“์˜ ์ž…๋ ฅ์ด ๋œ๋‹ค.

 

 

โœ… TCP socket programming ํŠน์ง•

 - ์†Œ์ผ“๋ผ๋ฆฌ ๋จผ์ € ์—ฐ๊ฒฐํ•˜๊ณ  ๋‚˜์„œ ํ†ต์‹ ์„ ์‹œ์ž‘ํ•œ๋‹ค. (connection-oriented)

 - ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๋Š” 1:1๋กœ ํ†ต์‹ ํ•œ๋‹ค.

 - ๋ฐ์ดํ„ฐ๋ฅผ byte-stream์œผ๋กœ ์ฃผ๊ณ ๋ฐ›๋Š”๋‹ค.

 - ์‹ ๋ขฐ์„ฑ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์ „์†ก์„ ํ•œ๋‹ค.

 - ์ž๋ฐ”์—์„œ๋Š” TCP ์†Œ์ผ“ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์œ„ํ•ด Socket, ServerSocket ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•œ๋‹ค.

 

 

โœ… ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ํ†ต์‹  ๊ณผ์ •

 

 1) ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋žจ: ์„œ๋ฒ„ ์†Œ์ผ“์„ ์ƒ์„ฑํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ์˜ ์—ฐ๊ฒฐ ์š”์ฒญ์„ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.

ServerSocket serverSocket = new ServerSocket(portNumber);

 

 2) ํด๋ผ์ด์–ธํŠธ ํ”„๋กœ๊ทธ๋žจ: ์ ‘์†ํ•  ์„œ๋ฒ„์˜ ip์ฃผ์†Œ์™€ ์„œ๋ฒ„์˜ ํฌํŠธ๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์ง€๊ณ  ์†Œ์ผ“์„ ์ƒ์„ฑํ•˜์—ฌ ์„œ๋ฒ„์— ์—ฐ๊ฒฐ์„ ์š”์ฒญํ•œ๋‹ค.

Socket socket = new Socket(hostIP, portNumber);


 3) ์„œ๋ฒ„ ์†Œ์ผ“: ํด๋ผ์ด์–ธํŠธ์˜ ์—ฐ๊ฒฐ ์š”์ฒญ์„ ๋ฐ›์œผ๋ฉด, ์„œ๋ฒ„๋Š” ์ƒˆ๋กœ์šด ์†Œ์ผ“์„ ์ƒ์„ฑํ•ด์„œ ํด๋ผ์ด์–ธํŠธ์˜ ์†Œ์ผ“๊ณผ ์—ฐ๊ฒฐํ•œ๋‹ค.

Socket newSocket = serverSocket.accept(); // ์„œ๋ฒ„๊ฐ€ ์ƒ์„ฑํ•œ ์ƒˆ๋กœ์šด ์†Œ์ผ“

 

 4) ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ์„œ๋ฒ„์˜ ์†Œ์ผ“๊ณผ ํด๋ผ์ด์–ธํŠธ ์†Œ์ผ“์ด ์—ฐ๊ฒฐ๋˜์–ด ์„œ๋กœ ํ†ต์‹ ํ•œ๋‹ค.



โœ… ์„œ๋ฒ„ ์†Œ์ผ“(ServerSocket)์˜ ์—ญํ• 

 

 - ์„œ๋ฒ„์˜ ํฌํŠธ์™€ bindingํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ํฌํŠธ๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ์˜ ์—ฐ๊ฒฐ ์š”์ฒญ์„ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.

 - ์—ฐ๊ฒฐ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ์ƒˆ๋กœ์šด ์†Œ์ผ“์„ ์ƒ์„ฑํ•˜์—ฌ, ์—ฐ๊ฒฐ์„ ์š”์ฒญํ•œ ํด๋ผ์ด์–ธํŠธ์˜ ์†Œ์ผ“๊ณผ ํ†ต์‹  ๊ฐ€๋Šฅํ•˜๋„๋ก ์—ฐ๊ฒฐ์‹œ์ผœ์ค€๋‹ค.

 - ์ฆ‰, ์‹ค์ œ ํ†ต์‹ ์€ ์„œ๋ฒ„ ์†Œ์ผ“๊ณผ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค.

 - ์‹ค์ œ ํ†ต์‹ ์€ ์„œ๋ฒ„ ์†Œ์ผ“์ด ๋งŒ๋“ค์–ด์ค€ ์ƒˆ๋กœ์šด ์„œ๋ฒ„์ธก์˜ ์†Œ์ผ“์ด ํ•œ๋‹ค.


 - ์›๋ž˜๋Š” ํ•˜๋‚˜์˜ ํฌํŠธ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์†Œ์ผ“์ด ๊ณต์œ ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์„œ๋ฒ„ ์†Œ์ผ“์€ ํฌํŠธ๋ฅผ ๋…์ ํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.

 - ์„œ๋ฒ„ ์†Œ์ผ“์ด ์—ฌ๋Ÿฌ ๊ฐœ๋ฉด, ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ์–ด๋А ๊ณณ์— ์—ฐ๊ฒฐ์„ ์š”์ฒญํ•ด์•ผ ํ• ์ง€ ๋ชจ๋ฅด๋‹ˆ๊นŒ!!

 

 

โœ… ๊ฐ„๋‹จํ•œ ์†Œ์ผ“ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์˜ˆ์ œ

 

 - ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๊ณ , ์„œ๋ฒ„๋Š” ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ํ„ฐ๋ฏธ๋„์— ์ถœ๋ ฅํ•˜๋Š” ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด ๋ณด์•˜๋‹ค.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) {
        try {

            // ์„œ๋ฒ„ ์†Œ์ผ“์„ ์ƒ์„ฑํ•˜๊ณ , ํด๋ผ์ด์–ธํŠธ์˜ ์—ฐ๊ฒฐ ์š”์ฒญ์„ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.
            ServerSocket serverSocket = new ServerSocket(1234);
            System.out.println("์„œ๋ฒ„ ์—ฐ๊ฒฐ ์š”์ฒญ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ค‘...");

            // ์—ฐ๊ฒฐ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ํด๋ผ์ด์–ธํŠธ์™€ ์—ฐ๊ฒฐ์‹œ์ผœ์ค„ ์ƒˆ๋กœ์šด ์†Œ์ผ“์„ ์ƒ์„ฑํ•œ๋‹ค.
            Socket socket = serverSocket.accept();
            System.out.println("ํด๋ผ์ด์–ธํŠธ์™€ ์—ฐ๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");


            // ์†Œ์ผ“์˜ ์ž…๋ ฅ์ŠคํŠธ๋ฆผ
            BufferedReader socketIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String line;
            while ((line = socketIn.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e){
            e.printStackTrace();
        }
    }
}
import java.io.*;
import java.net.Socket;

public class Client {
    public static void main(String[] args) {

        try {
            Socket socket = new Socket("localhost", 1234);
            System.out.println("์„œ๋ฒ„์— ์—ฐ๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");

            // ํ„ฐ๋ฏธ๋„ ์ž…๋ ฅ๋ฐ›์„ ๋ฒ„ํผ
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

            // ์†Œ์ผ“์˜ ์ถœ๋ ฅ์ŠคํŠธ๋ฆผ
            BufferedWriter socketOut = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

            // ํ„ฐ๋ฏธ๋„๋กœ๋ถ€ํ„ฐ ์ž…๋ ฅ๋ฐ›์€ ๋ฌธ์ž์—ด์„ ์„œ๋ฒ„ ์†Œ์ผ“์œผ๋กœ ์ „์†กํ•œ๋‹ค.
            String input;
            while ((input = reader.readLine()) != null) {
                socketOut.write(input);
                socketOut.write("\n");
                socketOut.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
728x90

'๊ฐœ์ธ ๊ณต๋ถ€ > Java, Python' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Java] Reflection  (0) 2023.11.17
[Java] equals(), hashCode()  (0) 2023.10.25
[Java] BlockingQueue  (0) 2023.10.18
[Java] ์ž๋ฐ” ๋กœ๊น…(Logging)  (0) 2023.09.06
๊ฐ์ฒด์ง€ํ–ฅ์˜ ํŠน์ง•  (0) 2023.07.24