ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 네트워크 입출력
    JAVA 2023. 3. 20. 11:56
    • 데이터 입출력을 네트워크 영역으로 확장한 개녕
    • 네트워크(network) : 여러 컴퓨터(단말기) 들을통신 회선으로 연결한 것
      • LAN(Local Area Network) : 가정, 회사, 건물 등 특정 영역 내에 위치한 컴퓨터를 연결한 것
      • WAN(World Area Network) : 라우터(Router)로 LAN과 LAN을 연결한 것(= 인터넷)

     


    서버와 클라이언트

    • 서버(Server) : 서비스를 제공하는 프로그램
      - 클라이언트가 언제 서비스를 요청할지 알 수 없으므로 보통 24시간 항상 가동
      - 클라이언트의 요청에 대해 처리하고 응답
    • 클라이언트(Client) : 서버에서 제공하는 서버스를 요청하는 프로그램
      - 사용자에 의해 수시로 시작되고 종료됨

     


    IP 주소(Internet Protocol)

    • 'ipconfig' : PC의 IP 주소 확인 가능
    • 'ipconfig /all' : IP 관련 모든 정보 표시
    • 내부 IP와 인터넷 환경에서 사용하는 외부 IP 주소로 구성
    • 회사 네트워크 사용 시 보다 쉽게 관리하기 위해 IP를 고정으로 설정하는 경우가 많다.
    • 컴퓨터의 IP는 네트워크 어댑터(LAN 카드)마다 할당된다.
    • 연결할 상대방 컴퓨터의 IP 주소를 알고 있어야 프로그램 간(서버-클라이언트) 통신이 가능하다.
    • DNS(Domain Name System) : 도메인 이름으로 IP를 등롱하는 저장소.
      - 클라이언트가 도메인 이름으로 요청하면 DNS 서버에서 IP로 응답
      - 외부 IP로 연결
    • 컴퓨터 통신을 하려면 최소한 PC의 IP 주소와 DNS IP가 설정되어 있어야 한다.

     


    IP 주소 얻기

    • 자바는 IP주소를 표현한 InetAddress(java.net) 객체로 IP 정보를 얻을 수 있다.
      - 로컬 컴퓨터의 IP 주소를 포함한 도메인 이름으로 등록된 IP 주소도 얻을 수 있다.
      - InetAddress는 직접 객체를 생성할 수 없고, 정적 메소드를 이용해 객체를 얻을 수 있다.

     

    //로컬 컴퓨터의 InetAddress 객체 얻기
    InetAddress ia = InentAddress.getLocalHost();
     
    //컴퓨터의 도메인 이름으로 등록된 InetAddress 객체 얻기
    InetAddress isa = InetAddress.getByName(String domainName);
     
    //하나의 도메인 이름으로 등록된 모든 서버의 InetAddress 객체 언기
    InetAddress[ ] iaArr = InetAddress.getAllByName(String domainName);
     
    //InetAddress 객체의 IP 주소
    String ip = InetAddress.getHostAddress();

     

    • 규모가 큰 프로그램의 경우 여러 서버를 하나의 도메인에 등록하여 사용하기도 하며, 이 도메인에 연결된 모든 IP 주소를 배열로 가져올 수 있다.

     


    Port 번호

    • 프로그램과 프로그램 간의 연결에 필요한 정보
    • 운영체제가 관리하는 서버 프로그램 고유의 연결 번호
    • 서버의 포트 번호
      - 시작할 때 특정 포트 번호에 바인딩  (고정적)
    • 클라이언트의 포트 번호
      - 서버에서 보내는 응답을 받기 위해 운영체제가 자동으로 부여한 번호를 사용 (유동적)
      - 서버로 서비스를 요청할 떄 같이 전송한다.
      • Wll Konw Port Numbers
        범위 : 0 ~ 1023
        널리 사용하는 프로그램에 대한 포트 번호
        국제인터넷주소관리기구(CANN)가 특정 애플리케이션용으로 미리 예약한 포트
      • Registerted Port Numbers
        범위 : 1024 ~ 49151
        회사에서 등록해서 고정적으로 사용할 수 있는 포트
        상용 포트
      • Dynamic Or Private Port Numbers
        범위 : 49152 ~ 65535
        운영체제가 부여하는 동적포트
        개인적인 목적으로 사용할 수 있는 포트
        테스트용으로 사용

     


    서버의 동시 요청 처리

    • 서버는 불특정 다수의 클라이언트로부터 들어온 요청을 동시에 처리할 수 있어야 한다.
    • 클라이언트의 수가 증가하게 되면(폭증) 서버 쪽 부하가 많이 걸리게 된다.
      - 서버에 부하가 걸리면 서버가 다운되거나 요청에 대한 응답을 처리하는 시간이 오래 걸리게 된다.
      - 이러한 문제를 보완하기 위해 스레드풀을 사용하는 방법이 있다.
    • 스레드풀(Thread Pool)
      - 작업을 처리할 수 있느 스레드 수를 제한하여 클라이언트 폭증이 발생해도 서버에 걸리는 부하를 줄일 수 있다.
      - 하지만 작업 큐의 대기 작업이 증가하기 때문에 클라이언트의 요청에 응답하는데 시간이 걸리는 단점이 있다.
      - 스레드풀 안의 모든 스레드가 종료되어야 프로세스가 최종적으로 종료될 수 있다.

     

    • 스레드풀 생성

     

    ExecutorService executorService = Executors.newFixedThreadPool(countTread);

     

     

    • 병렬 처리할 문장을 스레드풀에 람다식으로 작성

     

    executorService.execute(() -> {
        ...
    });

     

     

    • 서버 종료 시 실행 중인 스레드를 종료되도록 스레드풀도 중지

     

    executorService.shutdownNow();

     


    'JAVA' 카테고리의 다른 글

    UDP 네트워킹  (0) 2023.03.20
    TCP 네트워킹  (0) 2023.03.20
    보조 스트림  (0) 2023.03.17
    데이터 입출력  (0) 2023.03.17
    스트림 요소 처리  (0) 2023.03.16
Designed by Tistory.