-
- 데이터 입출력을 네트워크 영역으로 확장한 개녕
- 네트워크(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
운영체제가 부여하는 동적포트
개인적인 목적으로 사용할 수 있는 포트
테스트용으로 사용
- Wll Konw Port Numbers
서버의 동시 요청 처리
- 서버는 불특정 다수의 클라이언트로부터 들어온 요청을 동시에 처리할 수 있어야 한다.
- 클라이언트의 수가 증가하게 되면(폭증) 서버 쪽 부하가 많이 걸리게 된다.
- 서버에 부하가 걸리면 서버가 다운되거나 요청에 대한 응답을 처리하는 시간이 오래 걸리게 된다.
- 이러한 문제를 보완하기 위해 스레드풀을 사용하는 방법이 있다. - 스레드풀(Thread Pool)
- 작업을 처리할 수 있느 스레드 수를 제한하여 클라이언트 폭증이 발생해도 서버에 걸리는 부하를 줄일 수 있다.
- 하지만 작업 큐의 대기 작업이 증가하기 때문에 클라이언트의 요청에 응답하는데 시간이 걸리는 단점이 있다.
- 스레드풀 안의 모든 스레드가 종료되어야 프로세스가 최종적으로 종료될 수 있다.
- 스레드풀 생성
ExecutorService executorService = Executors.newFixedThreadPool(countTread);- 병렬 처리할 문장을 스레드풀에 람다식으로 작성
executorService.execute(() -> {...});- 서버 종료 시 실행 중인 스레드를 종료되도록 스레드풀도 중지
executorService.shutdownNow();