본문 바로가기
자바/이것이 자바다

19. 네트워크 입출력

by 989898 2024. 11. 26.

19.1 네트워크 기초

네트워크(network)는 여러 컴퓨터들을 통신 회선으로 연결한 것을 말한다. LAN(Local Area Network)은 가정, 회사, 건물, 특정 영역에 존재하는 컴퓨터를 연결한 것이고, WAN(Wide Area Network)은 LAN을 연결한 것이다. WAN이 우리가 흔히 말하는 인터넷(Internet)이다. 

 

서버와 클라이언트

 

네트워크에서 유무선으로 컴퓨터가 연결되어 있다면 실제로 데이터를 주고받는 행위는 프로그램들이 한다. 서비스를 제공하는 프로그램을 일반적으로 서버(server)라고 부르고, 서비스를 요청하는 프로그램을 클라이언트(client)라고 부른다.

 

인터넷에서 두 프로그램이 통신하기 위해서는 먼저 클라이언트가 서비스를 요청하고, 서버는 처리결과를 응답으로 제공해준다.

 

 IP 주소

 

컴퓨터의 고유한주소 = IP(Internet Protocol)


IP 주소는 네트워크 어댑터 (LAN 카드)마다 할당된다. 만약 컴퓨터에 두 개의 네트워크 어댑터가 장착되어 있다면, 두 개의 IP 주소를 할당받을 수 있다.

 

네트워크 어댑터에 어떤 IP 주소가 부여되어 있는지 확인하려면 윈도우에서는 ipconfig 명령어를, 맥OS 에서는 ifconfig 명령어를 실행하면 된다. 다음은 윈도우 명령 프롬프트 (cmd)에서 ipconfig 명령어를 실행한 결과로, IP 주소는 xxx.xxx.xxx.xxx와 같은 형식으로 출력된다. 여기서 xxx는 부호 없는 0 ~ 255 사이의 정수이다.

 

지피티 답변

 

연결할 상대방 컴퓨터의 IP 주소를 모르면 프로그램들은 서로 통신할 수가 없다. 우리가 전화번호를 모르면 114로 문의하듯이 프로그램은 DNS(Domain Name System)를 이용해서 컴퓨터의 IP 주소를 검색한다. 여기에서 DNS는 도메인 이름으로, IP를 등록하는 저장소이다. 대중에게 서비스를 제공하는 대부분의 컴퓨터는 다음과 같이 도메인 이름으로 IP를 DNS에 미리 등록해 놓는다.

도메인 이름 : www.naver.com
IP 주소 : 222.122.195.5


웹 브라우저는 웹 서버와 통신하는 클라이언트로, 사용자가 입력한 도메인 이름으로 DNS에서 IP 주소를 검색해 찾은 다음 웹 서버와 연결해서 웹 페이지를 받는다. 

 

Port 번호

 

한 대의 컴퓨터에는 다양한 서버 프로그램들이 실행될 수 있다. 예를 들어 웹(Web) 서버, 데이터 베이스 관리 시스템(DBMS), FTP 서버 등이 하나의 IP 주소를 갖는 컴퓨터에서 동시에 실행될 수 있다. 

이 경우 클라이언트는 어떤 서버와 통신해야 할지 결정해야 한다. IP는 컴퓨터의 네트워크 어댑터까지만 갈 수 있는 정보이기 때문에, 컴퓨터 내부에서 실행하는 서버를 실행하기 위해서는 추가적인 Port 번호가 필요하다.

 

Port는 운영체제가 관리하는 서버 프로그램의 연결 번호이다. 서버는 시작할 때 특정 Port 번호에 바인딩한다. 예를 들어 웹 서버는 80번으로, DBMS는 1521번으로 바인딩할 수 있다. 따라서 클라이언트가 웹 서버와 통신하려면 80번으로, DBMS와 통신하려면 1521번으로 요청을 해야 한다.

 

 클라이언트도 서버에서 보낸 정보를 받기 위해서는 Port 번호가 필요한데, 서버와 같이 고정적인 Port 번호에 바인딩하는 것이 아니라 운영체제가 자동으로 부여하는 번호를 사용한다. 이 번호는 클라이언트가 서버로 요청할 때 함께 전송되어 서버가 클라언트로 데이터를 보낼 때 사용된다.

 

프로그램에서 사용할 수 있는 전체 Port 번호의 범위는 0 ~ 65535로, 다음과 같이 사용 목적에 따라 세 가지 범위를 가진다.   

구분명 범위 설명
Well Know Port Numbers 0 ~ 1023 국제인터넷주소관리기구(ICANN)가 특정 애플리케이션용으로 미리 예약한 Port
Registered Port Numbers 1024 ~ 49151 회사에서 등록해서 사용할 수 있는 Port
Dynamic Or Private Port Numbers 49152 ~ 65535 운영체제가 부여하는 동적 Port 또는 개인적인 목적으로 사용할 수 있는 Port

19.2 IP 주소 얻기

자바는 IP 주소를 java.net 패키지의 InetAddress로 표현한다. InetAddress를 이용하면 로컬 컴퓨터의 IP 주소를 얻을 수 있고, 도메인 이름으로 DNS에서 검색한 후 IP 주소를 가져올 수도 있다.

로컬 컴퓨터의 InetAddress를 얻고 싶다면 InetAddress.getLocalHost() 메서드를 다음과 같이 호출하면 된다.

InetAddress ia = InetAddress.getLocalHost();

 

만약 컴퓨터의 도메인 이름을 알고 있다면 다음 두 개의 메서드를 사용하여 InetAddress 객체를 얻을 수 있다.

InetAddress ia = InetAddress.getByName(String domainName);
InetAddress[] iaArr = InetAddress.getAllbyName(String domainName);

 

getByName() 메서드는 DNS에서 도메인 이름으로 등록된 단 하나의 IP 주소를 가져오고, getAllByName() 메서드는 등록된 모든 IP 주소를 배열로 가져온다. 하나의 도메인 이름으로 여러 IP가 등록되어 있는 이유는 클라이언트가 많이 연결되어 있을 경우 서버 부하를 나누기 위해서이다.

이 메서드들로부터 얻은 InetAddress 객체에서 IP 주소를 얻으려면 getHostAddress() 메서드를 다음과 같이 호출하면 된다.
리턴값은 문자열로 된 IP 주소이다.

String ip = InetAddress.getHostAddress();

 

다음 예제는 로컬 컴퓨터의 IP와 네이버 웹 사이트 (www.naver.com)의 IP 정보를 출력한다.

import java.net.InetAddress;

public class InetAddressExample {
    public static void main(String[] args) {
        try {
            InetAddress local = InetAddress.getLocalHost();
            System.out.println("내 컴퓨터의 IP 주소 : " + local.getHostAddress());

            InetAddress[] iaArr = InetAddress.getAllByName("www.naver.com");
            for(InetAddress remote : iaArr) {
                System.out.println("www.naver.com IP 주소 : " + remote.getHostAddress());
            }
            } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }
}

19.3 TCP 네트워킹

IP 주소로 프로그램들이 통신할 때는 약속된 데이터 전송 규약이 있다. 이것을 전송용 프로토콜이라고 부른다. 인터넷에서 전송용 프로토콜은 TCP(Transmission Control Protocol)UDP(User Datagram Protocol)가 있다.

 

TCP는 연결형 프로토콜로, 상대방이 연결된 상태에서 데이터를 주고 받는다. 클라이언트가 연결 요청을 하고 서버가 연결을 수락하면 통신 회선이 고정되고, 데이터는 고정 회선을 통해 전달된다. 그렇기 때문에 TCP는 보낸 데이터가 순서대로 전달되며 손실이 발생하지 않는다.

 

TCP는 IP와 함께 사용하기 때문에 TCP/IP라고도 한다. TCP는 웹 브라우저가 웹 서버에 연결할 때 사용되며 이메일 전송, 파일 전송, DB 연동에도 사용된다.

 

자바는 TCP 네트워킹을 위해 java.net 패키지에서 ServerSocketSocket 클래스를 제공하고 있다. ServerSocket은 클라이언트의 연결을 수락하는 서버 쪽 클래스이고, Socket은 클라이언트에서 연결 요청할 때와 클라이언트와 서버 양쪽에서 데이터를 주고 받을 때 사용되는 클래스이다.

JavaSocket을 생성할 때는 바인딩할 Port 번호를 지정해야 한다. 위 그림에서는 50001 번이 Port 이다. 서버가 실행되면 클라이언트는 Socket을 이용해서 서버의 IP 주소와 Port 번호로 연결 요청을 할 수 있다. ServerSocket은 accept() 메서드로 연결 수락을 하고 통신용 Socket을 생성한다. 그리고 나서 클라이언트와 서버는 양쪽의 Socket을 이용해서 데이터를 주고받게 된다.

 

TCP 서버

 

TCP 서버 프로그램을 개발하려면 우선 ServerSocket 객체를 생성해야 한다. 다음은 50001번 Port에 바인딩하는 ServerSocket를 생성하는 코드이다.

ServerSocket serverSocket = new ServerSocket(50001);

 

ServerSocket을 생성하는 또 다른 방법은 기본 생성자로 객체를 생성하고 Port 바인딩을 위해 bind() 메서드를 호출하는 것이다. 

'자바 > 이것이 자바다' 카테고리의 다른 글

18  (0) 2024.11.25
17. 스트림 요소 처리  (0) 2023.11.21
16. 람다식  (1) 2023.11.20
15. 컬렉션 자료구조  (0) 2023.11.18
14. 멀티 스레드  (1) 2023.11.17