[java] Socket


Socket

Socket ?

์†Œ์ผ“ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์†Œ์ผ“์„ ์ด์šฉํ•œ ํ†ต์‹  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋œปํ•˜๋Š”๋ฐ, ์†Œ์ผ“์ด๋ž€ ํ”„๋กœ์„ธ์Šค๊ฐ„์˜ ํ†ต์‹ ์— ์‚ฌ์šฉ๋˜๋Š” ์–‘์ชฝ ๋๋‹จ(endPoint)์„ ์˜๋ฏธํ•œ๋‹ค. ํ”„๋กœ์„ธ์Šค๊ฐ„์˜ ํ†ต์‹ ์„ ์œ„ํ•ด์„œ๋Š” ๋ฌด์–ธ๊ฐ€๊ฐ€ ํ•„์š”ํ•˜๊ณ  ์ด๊ฒƒ์ด ์†Œ์ผ“์ด๋‹ค.

  • ์†Œ์ผ“ โ†’ ํ”„๋กœํ† ์ฝœ, ip์ฃผ์†Œ, ํฌํŠธ๋„˜๋ฒ„๋กœ ์ •์˜ ๋จ.
  • ๋–จ์–ด์ ธ ์žˆ๋Š” ๋‘ ํ˜ธ์ŠคํŠธ๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ๋„๊ตฌ๋กœ์จ ์ธํ„ฐํŽ˜์ด์Šค ์—ญํ• .
  • ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ์ฒด๋กœ ์†Œ์ผ“์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ํ†ต๋กœ๊ฐ€ ๋งŒ๋“ค์–ด ์ง„๋‹ค.
  • ์†Œ์ผ“์˜ ์—ญํ• ์— ๋”ฐ๋ผ ํด๋ผ์ด์–ธํŠธ ์†Œ์ผ“, ์„œ๋ฒ„์†Œ์ผ“์œผ๋กœ ๊ตฌ๋ถ„๋œ๋‹ค.

TCP

  • ์–‘๋ฐฉํ–ฅ์œผ๋กœ ๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆผ์„ ์ „์†ก, ์—ฐ๊ฒฐ ์ง€ํ–ฅ์„ฑ
  • ์˜ค๋ฅ˜ ์ˆ˜์ •, ์ „์†ก ์ฒ˜๋ฆฌ, ํ๋ฆ„์ œ์–ด ๋ณด์žฅ
  • ์†ก์‹ ๋œ ์ˆœ์„œ์— ๋”ฐ๋ผ ์ค‘๋ณต๋˜์ง€ ์•Š๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹  โ†’ ์˜ค๋ฒ„ํ—ค๋“œ ๋ฐœ์ƒ
  • ์†Œ๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ณด๋‹ค ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ์— ์ ํ•ฉ

UDP

  • ๋น„์—ฐ๊ฒฐํ˜• ์†Œ์ผ“
  • ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ์— ์ œํ•œ์ด ์žˆ์Œ.
  • ํ™•์‹คํ•˜๊ฒŒ ์ „๋‹ฌ์ด ๋ณด์žฅ๋˜์ง€ ์•Š์Œ. โ†’ ๋ฐ์ดํ„ฐ๊ฐ€ ์†์‹ค๋˜๋„ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์•ˆ๋จ.
  • ์‹ค์‹œ๊ฐ„ ๋ฉ€ํ‹ฐ๋ฏธ๋””์–ด ์ •๋ณด๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ฃผ๋กœ ์‚ฌ์šฉ โ†’ ์ „ํ™”

Server Socket API

ServerSocket์˜ ํด๋ž˜์Šค๋Š” ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ณผ์ •์€ Step1 ~ Step 6์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


Step 1. ์„œ๋ฒ„ ์†Œ์ผ“ ์ƒ์„ฑ, ํฌํŠธ ๋ฐ”์ธ๋”ฉ

Step 2. ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ์˜ ์—ฐ๊ฒฐ์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ (Connect Listen) ์š”์ฒญ์ด ์˜ค๋ฉด ์ˆ˜๋ฝ

Step 3. ํด๋ผ์ด์–ธํŠธ ์†Œ์ผ“์—์„œ ๊ฐ€์ ธ์˜จ InputStream(ํด๋ผ์ด์–ธํŠธ ์ชฝ์—์„œ๋Š” OuputStream ์ด ๋ฉ๋‹ˆ๋‹ค)์„ ์ฝ์Œ

Step 4. ์‘๋‹ต์ด ์žˆ๋‹ค๋ฉด OutputStream์„ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋ƒ„

Step 5. ํด๋ผ์ด์–ธํŠธ์™€์˜ ์—ฐ๊ฒฐ์„ ๋‹ซ์Œ

Step 6. ์„œ๋ฒ„ ์ข…๋ฃŒ

์‚ฌ์šฉ ๋ชฉ์ ์ด๋‚˜ ์šฉ๋„์— ๋”ฐ๋ผ์„œ 3~4๋‹จ๊ณ„๋Š” ๋ฐ˜๋ณต ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์„ค๋ช…๋“œ๋ฆด ํ†ต์‹ ์˜ ์ˆœ์„œ๋Š”

Create a Server Socket Listen for a connection Read data from the client Send Data to the Client Close the client Connection Terminate the Server

์ž…๋‹ˆ๋‹ค.


Step 1. Create a Server Socket

๋‹ค์Œ ์ƒ์„ฑ์ž ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ServerSocket ํด๋ž˜์Šค์˜ ์ƒˆ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

img1 daumcdn

-ServerSocket(int port) : ์ง€์ •๋œ ํฌํŠธ ๋ฒˆํ˜ธ์— ๋ฐ”์ธ๋”ฉ ๋œ ์„œ๋ฒ„ ์†Œ์ผ“์„ ๋งŒ๋“ฌ (์—ฐ๊ฒฐ ๋Œ€๊ธฐ์—ด ์ตœ๋Œ€ ์ˆ˜ 50)

- ServerSocket(int port, int backlog): ์ง€์ •๋œ ํฌํŠธ ๋ฒˆํ˜ธ์— ๋ฐ”์ธ๋“œ ๋œ ์„œ๋ฒ„ ์†Œ์ผ“์„ ๋งŒ๋“ค๊ณ  ๋Œ€๊ธฐ์ค‘์ธ ์ตœ๋Œ€ ์—ฐ๊ฒฐ ์ˆ˜๋ฅผ backlog ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ง€์ •

- ServerSocket(int port, int backlog, InetAddress bindAddr) : ์„œ๋ฒ„ ์†Œ์ผ“์„ ๋งŒ๋“ค๊ณ  ์ง€์ •๋œ ํฌํŠธ ๋ฒˆํ˜ธ์™€ ๋กœ์ปฌ IP ์ฃผ์†Œ์— ๋ฐ”์ธ๋”ฉ

๊ฐ„๋‹จํ•œ ์‚ฌ์šฉ ์˜ˆ ์ž…๋‹ˆ๋‹ค. ์„œ๋ฒ„ ์†Œ์ผ“์„ ํฌํŠธ๋ฒˆํ˜ธ 8000์— ๋ฐ”์ธ๋”ฉํ•˜๋Š” ์˜ˆ ์ž…๋‹ˆ๋‹ค.

ServerSocket serverSocket = new ServerSocket(8000);

์ด๋Ÿฌํ•œ ์ƒ์„ฑ์ž๋Š” ์†Œ์ผ“์„ ์—ด ๋•Œ I/O Exception์ด ์ผ์–ด ๋‚  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ณ ๋ ค ํ•ด ์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


Step 2. Listen for a connection

์—ฐ๊ฒฐ ์ˆ˜์‹ ์˜ ์˜ˆ ์ž…๋‹ˆ๋‹ค.

Socket socket = serverSocket.accept();


Step 3. Read data from the Client

Socket ๊ฐ์ฒด๊ฐ€ ๋ฐ˜ํ™˜ ๋˜๋ฉด (์—ฐ๊ฒฐ์ด ๋˜๋ฉด) InputStream์„ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ณด๋‚ธ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

InputStream input = socket.getInputStream();

InputStream์€ ๋ฐ์ดํ„ฐ๋ฅผ byte ๋ฐฐ์—ด๋กœ ์ฝ๊ธฐ ๋•Œ๋ฌธ์—, ์ƒ์œ„ ๋ ˆ๋ฒจ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์œผ๋ ค๋ฉด InputStreamReader๋กœ ์ฝ์–ด์ค๋‹ˆ๋‹ค.

InputStreamReader reader = new InputStreamReader(input);
int character = reader.read();  // reads a single character

๋˜ํ•œ BufferedReader์— InputStream์„ ๋ž˜ํ•‘ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ String์œผ๋กœ ์ฝ์–ด์˜ต๋‹ˆ๋‹ค.

BufferedReader reader = new BufferedReader(new InputStreamReader(input));
String line = reader.readLine();    // reads a line of text


Step 4. Send Data to the client

Socket๊ณผ ์—ฐ๊ฒฐ ๋œ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ OutputStream์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

OutputStream output = socket.getOutputStream();

PintWriter๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…์ŠคํŠธ ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

PrintWriter writer = new PrintWriter(output, true);
writer.println(โ€œThis is a message sent to the serverโ€);


Step 5. Close the client Connection

Socket ํ†ต์‹ ์ด ์™„๋ฃŒ ๋˜๋ฉด, close() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์™€์˜ ์—ฐ๊ฒฐ์„ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

socket.close();

close() ๋ฉ”์„œ๋“œ๋Š” ์†Œ์ผ“์˜ InputStream๊ณผ OutputStream์„ ๋‹ซ์•„ ์ฃผ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.


Step 6. Terminate the Server

์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์„ ๊ธฐ๋‹ค๋ฆฌ๋ฉฐ ํ•ญ์ƒ ์‹คํ–‰๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์„œ๋ฒ„๋ฅผ ์ค‘์ง€ ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ServerSocket ์ธ์Šฝํ„ด์Šค์˜ close() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์„œ๋ฒ„๋ฅผ ์ข…๋ฃŒ ํ•ด ์ค๋‹ˆ๋‹ค.

Client Connection์„ ์ข…๋ฃŒํ•˜๋Š” ๋ฉ”์„œ๋“œ์™€ ๋ช…์นญ์ด ๊ฐ™์ง€๋งŒ, Client์™€์˜ ์—ฐ๊ฒฐ์„ ๋Š๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ โ€œ์„œ๋ฒ„โ€๋ฅผ ์ค‘์ง€ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

serverSocket.close();


Java Server Socket Example

- Client ์ฝ”๋“œ

package com.woolbro.dev.socket.Client;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class TimeClient {

    public static void main(String[] args) {
        if (args.length < 2) {
            System.out.println("#######Need More Arguments #########");
            return;
        }

        String hostname = args[0];
        int port = Integer.parseInt(args[1]);
        for (int i = 0; i < 10; i++) {
            try (Socket socket = new Socket(hostname, port)) {
                OutputStream out = socket.getOutputStream();
                String realStr = "This is woolbro dev Test";
                out.write(realStr.getBytes());
                InputStream input = socket.getInputStream();
                BufferedReader reader = new BufferedReader(new InputStreamReader(input));

                String time = reader.readLine();

                System.out.println(time);

            } catch (UnknownHostException ex) {

                System.out.println("Server not found: " + ex.getMessage());

            } catch (IOException ex) {

                System.out.println("I/O error: " + ex.getMessage());
            }
        }

    }

}

- Server ์ฝ”๋“œ

package com.woolbro.dev.socket.Server;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;

public class TimeServer {

    public static void main(String[] args) {
        if (args.length < 1) {
            System.out.println("######## Argument is Null ########");
            return ;
        }
        
        int port = Integer.parseInt(args[0]);
 
        try (ServerSocket serverSocket = new ServerSocket(port)) {
 
            System.out.println("Server is listening on port " + port);
 
            while (true) {
                Socket socket = serverSocket.accept();
 
                System.out.println("[ "+socket.getInetAddress()+" ] client connected");
                OutputStream output = socket.getOutputStream();
                PrintWriter writer = new PrintWriter(output, true);
                writer.println(new Date().toString());

                InputStream input = socket.getInputStream();
                BufferedReader reader = new BufferedReader(new InputStreamReader(input));
                System.out.println("###### msg : "+reader.readLine());
            }
 
        } catch (IOException ex) {
            System.out.println("Server exception: " + ex.getMessage());
            ex.printStackTrace();
        }

    }

}



reference

https://woolbro.tistory.com/29

https://mainpower4309.tistory.com/25?category=774615

https://cbts.tistory.com/84

https://wonos.tistory.com/388