[F-Lab 챌린지 10일차] TIL : 자바의신 28장 - 네트워크 프로그래밍

성수데브리·2023년 7월 8일
0

f-lab_java

목록 보기
8/73
post-thumbnail

학습 목표


  • 네트워크 프로그래밍

학습 결과 요약


  • Socket 은 OS 커널에 구현되어 있는 프로토콜 요소에 대한 추상화된 인터페이스
    - User mode 의 어플리케이션 프로세스는 Kernel mode 에 진입할 수 없다. 커널 모드로 진입할 수 있는 추상화된 인터페이스가 파일 형태로 제공된다. 추상화된 주체가 TCP/IP 라면 Socket 이라 한다.
  • 장치 파일의 일종으로 이해할 수 있음
  • 일반 파일에 대한 개념이 대부분 적용됨
  • 소켓 프로그래밍이란 TCP 라는 대상을 추상화한 파일에 대한 입/출력을 하는 것이다.

학습 내용


네트워크

네크워크란 컴퓨터끼리 데이터를 주고 받는 시스템이다.

용어 정의

  • Host : 네트워크에 연결된 컴퓨터
  • Switch : Host가 네트워크 자체면 Switch 라 한다. 무엇을 스위칭 하는지가 중요하다
    • 스위칭이란 경로찾기 또는 인터페이스 선택 과정을 말한다.
    • 예시 : 라우터, 방화벽, IPS
    • MAC 주소로 스위칭을 한다 → L2 스위치
    • IP 주소로 스위칭을 한다. → L3 스위치
    • Port 로 스위칭을 한다 → L4 스위치
  • End-point : Host 가 네트워크 이용 주체라면 엔드포인트라 한다
  • 네트워크 : 인터넷 ( 라우터 + DNS )

네트워크 아키텍처

  • 컴퓨터가 데이터를 주고 받기위한 통신에는 네트워크 아키텍처를 이용한다.
  • 통신에 필요한 규칙을 프로토콜이라 하는데, 프로토콜의 집합이 바로 네트워크 아키텍처다.

네트워크의 공통 언어 TCP/IP

  • 네트워크 아키텍처에 여러 종류가 있지만 현재는 대부분 TCP/IP를 사용한다.
  • TCP/IP 에서는 역할별로 네 가지로 계층화된 복수의 프로토콜을 조합한다.

각 층마다 수행하는 역할이 다르다.

  • 어플리케이션층 : 에플리케이션에서 다룰 데이터 형식과 절차를 결정한다.
    • 프로토콜 : HTTP, SMTP
  • 트랜스포트층 : 어플리케이션에 데이터를 할당한다.
    • 프로토콜 : TCP, UDP
  • 인터넷층 : 네트워크 사이에서 데이터를 전송하는 역할. 엔드투엔드 통신을 한다.
    • 네트워크끼리 연결하고 데이터를 전송하는 기기가 라우터다.
    • 라우터에 의한 네트워크 간 전송을 가리켜 라우팅이라 한다.
    • 프로토콜 : IP, ICMP, ARP (ICMP와 ARP 는 IP 를 도와주는 프로토콜)
  • 네트워크 인터페이스층 : 같은 네트워크 안에서 데이터를 전송하는 역할을 한다.
    프로토콜은 자유롭게 선택 가능하다.
  • 4개 계층의 프로토콜이 모두 정상적으로 이뤄져야 비로소 통신에 성공한다.

소켓

소켓이란 무엇인가

https://www.codetextpro.com/2019/07/networking-socket-program.html

https://www.codetextpro.com/2019/07/networking-socket-program.html

  • Socket 은 OS 커널에 구현되어 있는 프로토콜 요소에 대한 추상화된 인터페이스
    • User mode 의 어플리케이션 프로세스는 Kernel mode 에 진입할 수 없다. 커널 모드로 진입할 수 있는 추상화된 인터페이스가 파일 형태로 제공된다. 추상화된 주체가 TCP/IP 라면 Socket 이라 한다.
  • 장치 파일의 일종으로 이해할 수 있음
  • 일반 파일에 대한 개념이 대부분 적용됨
  • 소켓 프로그래밍이란 TCP 라는 대상을 추상화한 파일에 대한 입/출력을 하는 것이다.

자바에서 Socket 통신

  • 소켓 통신이란 소켓을 통해 서버-클라이언트간 데이터를 주고받는 양뱡향 연결 지향성 통신을 말한다.
  • 자바에서는 어플리케이션 레이어에서 프로그래밍만 하면 트랜스포트 레이어에서 처리는 자바가 다 알아서 처리해준다.
  • Socket, ServerSocket 클래스를 사용하면 된다. !https://static.javatpoint.com/core/images/socket-programming.png

예시


public class SocketClientSample {

    public static void main(String[] args) {
        SocketClientSample sample = new SocketClientSample();
        sample.sendSocketSample();
    }

    private void sendSocketSample() {
        for (int i = 0; i < 4; i++) {
            sendSocketData("I liked java at " + new Date());
        }
        sendSocketData("EXIT");
    }

    private void sendSocketData(String s) {

        Socket socket = null;

        try{
            System.out.println("Client:connection");
            socket = new Socket("127.0.0.1", 9999);

            System.out.println("Client: Connect status = " + socket.isConnected());
            Thread.sleep(1000);

            OutputStream stream = socket.getOutputStream();

            BufferedOutputStream out = new BufferedOutputStream(stream);
            byte[] bytes = s.getBytes();
            out.write(bytes);
            System.out.println("Client: Sent data");
            out.close();

        } catch (IOException | InterruptedException e) {
            throw new RuntimeException(e);
        } finally {
            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }
}
public class SocketServerSample {
    public static void main(String[] args) throws IOException {

        SocketServerSample sample = new SocketServerSample();
        sample.startServer();
    }

    private void startServer() {

        ServerSocket server = null;
        Socket client = null;
        try {
            server = new ServerSocket(9999);

            while (true){

                System.out.println("SERVER WAITING FOR REQUEST...");

                client = server.accept();
                System.out.println("Server: Accepted.");

                InputStream stream = client.getInputStream();
                BufferedReader in = new BufferedReader(
                        new InputStreamReader(stream)
                );

                String data = null;
                StringBuilder receivedData = new StringBuilder();
                while ((data = in.readLine()) != null) {
                    receivedData.append(data);
                }

                System.out.println("Received Data: " +receivedData);
                in.close();
                stream.close();
                client.close();
                if (receivedData!=null && "EXIT".equals(receivedData.toString())){
                    System.out.println("Stop SocketServer");
                    break;
                }
                System.out.println("----------------------------------");
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (server != null) {
                try{
                    server.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }
}

참고


HTTP 통신과 Socket 통신의 차이점

  • HTTP 통신은 소켓 통신을 기반으로 동작하지만, HTTP는 소켓 통신보다 더 높은 추상화 수준을 가지고 있습니다

0개의 댓글