핑구

13. 네트워크 본문

JAVA 웹 개발/1. JAVA

13. 네트워크

코딩 펭귄 2022. 5. 13. 15:56
📅 2021.09.03

네트워크

  • 여러 대의 컴퓨터를 통신 회선으로 연결한 것으로 홈 네트워크, 지역 네트워크, 인터넷 등이 해당된다.
  • 서버와 클라이언트 : 네트워크로 연결된 컴퓨터 간의 관계를 역할로 구분한 개념이다.
    • 서버 : 서비스를 제공하는 프로그램으로 클라이언트의 연결을 수락하고, 요청 내용을 처리 후 응답을 보내는 역할을 한다.
    • 클라이언트 : 서비스를 받는 프로그램으로 네트워크 데이터를 필요로 하는 모든 애플리케이션이 해당된다.
  • IP 주소 : 네트워크 상에서 컴퓨터를 식별하는 번호로 네트워크 어댑터(랜카드)마다 할당되어 있다. 컴퓨터 자체를 식별해 준다.
  • 포트 : 같은 컴퓨터 내에서 프로그램을 식별하는 번호로 클라이언트는 서버 연결 요청 시 IP 주소와 포트 번호를 알아야 한다.

 

InetAddress 클래스

  • IP주소를 다루기 위해 자바에서 제공하는 클래스이다.
  • InetAddress 클래스의 메소드
    • getLocalHost() : 지역 호스트(네트워크에 연결되어 있는 컴퓨터)의 Host명과 IP주소를 반환한다. static 메소드이다.
    • getHostName() : 호스트의 이름을 반환한다.
    • getHostAddress() : 호스트의 IP 주소를 반환한다.
    • getAddress() : IP 주소를 byte 배열로 반환한다. 따라서 IP 주소의 값이 byte 범위를 초과하는 경우 오버 플로우가 발생하여 - 값이 출력될 수 있다.
    • getByName() : 도메인을 이용해 IP 주소를 얻어내는 메소드로 static 메소드이다.
    • getAllByName() : 서버가 큰 경우 여러 개의 서버가 존재할 수 있는데, 그때 모든 서버를 가지고 오는 메소드로 static 메소드이다.

 

소켓 프로그래밍

  • 소켓 : 프로세스 간의 통신에 사용되는 양쪽 끝단을 말한다.
  • TCP : 보낸 데이터와 해당 데이터가 올바른 데이터인지 확인할 수 있는 구분자를 같이 보내는 통신 방법이다. 만약 구분자를 확인하여 데이터가 손상된 경우에는 데이터를 다시 요청한다. 따라서 신뢰도가 굉장히 높지만, 시간이 오래 걸린다.
  • UDP : 데이터 전송 속도가 빠르지만 신뢰성 없는 데이터를 전송하는 비연결 지항적 프로토콜이다. 속도가 중요한 게임이나 채팅에 주로 사용된다.

 

TCP 소켓 프로그래밍

  • TCP(Transmission Control Protocol)
  • 클라이언트와 서버 간의 1:1 소켓 통신이며, 서버가 먼저 실행되어 클라이언트의 요청을 기다려야 하고, 서버용 프로그램과 클라이언트용 프로그램을 따로 구현해야 한다.
  • 자바에서는 TCP 소켓 프로그래밍을 위해 java.net 패키지에서 ServerSocket과 Socket 클래스를 제공한다.
  • 클라이언트 소켓은 통신을 위해 사용되며, 서버 소켓은 클라이언트 소켓과의 연결을 위해 사용된다.
  • ServerSocket: 포트와 연결되어 외부의 요청을 기다리다가 요청이 들어오면 수락 후 Socket을 생성해 소켓과 소켓 간의 통신이 이루어지도록 한다. 한 포트에 하나의 ServerSocket만 연결 가능하다.
  • Socket: 프로세스 간의 통신을 담당하며 InputStream과 OutputStream을 보유하고 있다. 해당 스트림을 이용하여 프로세스 간의 통신이 이루어진다.
  • 서버용 TCP 소켓 프로그래밍 순서
    1. 서버의 포트 번호를 정한다.
      서버의 포트 번호는 0~65535범위 내에서 정할 수 있으나, 1023 이하의 번호는 이미 사용 중인 포트가 많기 때문에 그 이상인 숫자를 사용하는 것을 권장한다. 대부분의 경우 5000번대 이후의 숫자를 사용하며, 10000을 넘지 않는다.
    2. 서버용 소켓 객체를 생성 후 포트와 결합한다.
      ServerSocket 객체 생성 후 포트 번호를 생성자로 넘겨 주면 결합이 완료된다.
    3. 클라이언트 쪽에서 접속 요청이 오기를 기다린다.
    4. 접속 요청이 오면 요청을 수락(accept메소드 이용) 후 해당 클라이언트에 대한 소켓 객체를 생성한다.
      accept 메소드의 반환 타입이 Socket이므로 해당 반환값을 받아주는 것만으로도 소켓 객체를 생성하는 것이다.
    5. 연결된 클라이언트와 입출력 스트림을 생성한다.
    6. 보조 스트림을 통해 성능을 개선한다.
    7. 스트림을 통해 읽고 쓰는 작업을 진행한다.
      스트림 사용 시 flush 메소드를 이용하여 버퍼에 데이터가 남지 않도록 청소해주어야 한다.
    8. 통신을 종료한다.
  • 클라이언트용 TCP 소켓 프로그래밍 순서
    1. 서버의 IP주소와 서버가 정한 포트 번호를 매개 변수로 하여 클라이언트용 소켓 객체를 생성한다.
      정상적인 경우 서버와 클라이언트의 IP는 다르며, 따라서 서버의 IP를 String으로 직접 입력해 주어야 한다
      연결에 실패하는 경우 null을 반환하기 때문에 조건문을 이용해 연결에 성공했을 경우에만 진행될 수 있도록 해주어야 한다.
    2. 서버와의 입출력 스트림을 오픈한다.
    3. 보조 스트림을 통해 성능을 개선한다.
    4. 스트림을 통해 읽고 쓰는 작업을 진행한다.
    5. 통신을 종료한다.

 

UDP 소켓 프로그래밍

  • 연결지향적이지 않기 때문에 연결 요청을 받아줄 서버 소켓이 필요없다.
  • java.net 패키지에서 제공하는 두 대의 DatagramSocket 간에 DatagramPacket으로 변환된 데이터를 주고 받는다.
  • 서버용 UDP 소켓 프로그래밍 순서
    1. 서버의 포트 번호를 정한다.
    2. DatagramSocket 객체를 생성한다.
    3. 연결한 클라이언트의 IP 주소를 가진 InetAddress 객체를 생성한다.
    4. 전송할 메시지를 byte[]로 바꾼다.
    5. 전송할 메시지를 DatagramPacket 객체에 담는다.
    6. 소켓 레퍼런스를 사용하여 메시지를 전송한다.
    7. 소켓을 닫는다.
  • 클라이언트용 UDP 소켓 프로그래밍 순서
    1. 서버가 보낸 메시지를 받을 byte[]를 준비한다.
    2. DatagramSocket 객체를 생성한다.
    3. 메시지를 받을 DatagramPacket 객체를 준비한다.
    4. byte[]로 받은 메시지를 String으로 바꾸어 출력한다.
    5. 소켓을 닫는다.

'JAVA 웹 개발 > 1. JAVA' 카테고리의 다른 글

MVC 패턴  (0) 2022.05.13
12. 컬렉션  (0) 2022.05.13
11. 입출력(IO)  (0) 2022.05.13
10. 예외 처리  (0) 2022.05.13
09. 기본 API  (0) 2022.05.10