네트워킹
두 대 이상의 컴퓨터를 케이블로 연결하여 네트워크를 구성하는 것이다
java.net패키지를 사용하면 네트워크 어플리케이션의 데이터 통신부분을 쉽게 작성할 수 있다
클라이언트/서버(client/server)
서버 : 서비스를 제공하는 컴퓨터(service provider)
클라이언트 : 서비스를 사용하는 컴퓨터(service user)
서버는 다수의 클라이언트에게 서비스를 제공하기 때문에 하드웨어의 사양에 관계없이 서비스를 제공하는 소프트웨어가 실행되는 컴퓨터를 서버라 한다
서비스는 서버가 클라이언트로부터 요청받은 작업을 처리하여 그 결과를 제공하는 것을 뜻한다
서버가 제공하는 서비스의 종류에 따라 파일서버, 메일서버, 어플리케이션 서버 등이 있다
서버에 접속하는 클라이언트 수에 따라 하나의 서버가 여러 가지 서비스를 제공하기도 하고 하나의 서비스를 여러 대의 서버로 제공하기도 한다
서버가 서비스를 제공하기 위해서는 서버 프로그램이 있어야 하고 클라이언트는 서버 프로그램과 연결할 수 있는 클라이언트 프로그램이 있어야 한다
일반 PC의 경우 주로 클라이언트 역할을 수행하지만 FTP Serv-U와 같은 FTP서버 프로그램이나 Tomcat과 같은 웹서버프로그램을 설치하면 서버역할도 수행할 수 있다
네트워크를 구성할 때 전용서버를 두는 것을 서버 기반 모델(server-based model)이라하고 별도의 전용서버없이 각 클라이언트가 서버역할을 동시에 수행하는 것을 P2P모델(peer – to –peer)이라 한다
모델간의 비교
서버기반 모델(server-based model) | P2P 모델(peer – to –peer model) |
-안정적인 서비스의 제공이 가능하다 -공유 데이터의 관리와 보안이 용이하다 -서버구축비용과 관리비용이 든다 |
-서버구축 및 운용비용을 절감할 수 있다 -자원의 활용을 극대화 할 수 있다 -자원의 관리가 어렵다 -보안이 취약하다 |
IP주소
컴퓨터(호스트)를 구별하는데 사용되는 고유한 값으로 인터넷에 연결된 모든 컴퓨터는 IP주소를 갖는다
IP주소는 4 byte(32bit)의 정수로 구성되어 있으며 4개의 정수가 마침표를 구분자로
‘a,b,c,d’와 같은 형식으로 표현된다 //a,b,c,d,는 부호없는 1byte값, 0~255사이의 정수이다
IP주소는 네트워크 주소와 호스트 주소로 나눌 수 있다
서로 다른 두 호스트의 IP주소의 네트워크 주소가 같다는 것은 두 호스트가 같은 네트워크에 포함되어 있다는 것을 의미한다
IP주소에서 네트워크 주소가 차지하는 자리수가 많을수록 호스트 주소의 범위가 줄어들기 때문에 네트워크 규모가 작아진다
*윈도우 OS에서 호스트 IP주소를 확인하려면 콘솔에서 ipconfig.exe를 실행시키면 된다
IP주소와 서브넷 마스크를 비트연산자 ‘&’로 연산하면 IP주소에서 네트워크 주소만을 뽑아낼 수 있다.
InetAddress
자바에서는 IP주소를 다루기위한 클래스로 InetAddress를 제공한다
InetAddress의 메서드
메서드 | 설명 |
byte[] getAddress() | IP주소를 byte배열로 반환한다 |
static InetAddress[] getAllByName(String host) |
도메인명(host)에 지정된 모든 호스트의 IP주소를 배열에 담아 반환한다 |
static InetAddress getByAddress(byte[] addr) | byte배열을 통해 IP주소를 얻는다 |
static InetAddress getByName(String host) |
도메인명(host)을 통해 IP주소를 얻는다 |
String getCanonicalHostName() | FQDN(fullt qualified domain name)을 반환한다 |
String getHostAddress() | 호스트의 IP주소를 반환한다 |
String getHostName() | 호스트의 이름을 반환한다 |
static InetAddress getLocalHost() | 지역호스트의 IP주소를 반환한다 |
boolean isMulticastAddress() | IP주소가 멀티캐스트 주소인지 알려준다 |
boolean isLoopbackAddress() | IP주소가 loopback 주소(127.0.0.1)인지 알려준다 |
하나의 도메인명에 여러 IP주소가 맵핑될 수 있고 또 그 반대의 경우도 가능하기 때문에 전자의 경우 getAllByName()을 통해 모든 IP주소를 얻을 수 있다
getLocatHost()를 사용하면 호스트명과 IP주소를 알아낼 수 있다
URL(Uniform Resource Locator)
인터넷에 존재하는 여러 서버들이 제공하는 자원에 접근할 수 있는 주소를 표현하기 위한 것이다
‘프로토콜://호스트명:포트번호/경로명/파일명>쿼리스트링#참조’의 형태로 이루어졌다
프로토콜 : 자원에 접근하기 위해 서버와 통신하는데 사용되는 통신규약(http) 호스트명 : 자원을 제공하는 서버의 이름 포트번호 : 통신에 사용되는 서버의 포트번호 경로명 : 접근하려는 자원이 저장된 서버상의 위치 파일명 : 접근하려는 자원의 이름 쿼리(query) : URL에서 ?이후의 부분 참조(anchor) : URL에서 #이후의 부분 |
URL 객체를 생성하는 방법
URl url = new URL();
URLConnection
어플리케이션과 URL간의 통신연결을 나타내는 클래스의 최상위 클래스로 추상클래스이다.
이를 상속받아 구현한 클래스로는 HttpURLConnection과 JarURLConnection이 있으며
URL의 프로토콜이 http인 경구, openConnection()은 Http URLConnection을 반환한다
연결하고자 하는 자원에 접근하고 읽고 쓰기를 할 수 있다, 관련된 정보를 읽고 쓸 수 있는 메서드가 제공된다
**openConnection()은 URL클래스의 메서드
URL이 유효하지 않으면 Malformed- URLException이 발생한다
소켓프로그래밍
소켓을 이용한 통신 프로그래밍을 뜻한다
소켓(socket) : 프로세스간의 통신에 사용되는 양쪽 끝단(endpoint)을 의미한다
java.net패키지를 통해 소켓 프로그래밍을 지워한다 스로토콜에 따라 다른 종류의 소켓을 구현하여 제공한다
TCP와 UDP
TCP/IP 프로토콜은 이기종 시스템간의 통신을 위한 표준 프로토콜로 프로토콜의 집합이다
TCP와 UDP모두 TCP/IP 프로토콜(TCP/IP protocol suites)에 포함되어 있으며, OSI 7 계층의 전송계층에 해당하는 프로토콜이다
TCP와 UDP의 비교
항목 | TCP | UDP |
연결방식 | 연결기반(connection-oriented) -연결 후 통신 -1:1 통신 |
비연결기반(connectionless-oriented) -연결없이 통신(소포) -1:1, 1:n, n;n 통신방식 |
특징 | 데이터의 경계를 구분안함(byte-stream) 신뢰성 있는 데이터 전송 -데이터의 전송순서가 보장됨 -데이터의 수신여부를 확인함 (데이터가 손실되면 재전송) -패킷을 관리할 필요가 없음 |
데이터의 경계를 구분함(datagram) 신뢰성 없는 데이터 전송 -데이터의 전송순서가 바뀔 수 있음 -데이터의 수신여부를 확인안함 (데이터가 손실되어도 알 수 없음) -패킷을 관리해주어야 함 TCP보다 전송속도가 빠름 |
관련 클래스 | Socket ServerSocket |
DatagramSocket DatagramPacket MulticastSocket |
-TCP를 이용한 통신은 전화, UDP를 이용한 통신은 소포에 비유된다
-TCP는 신뢰있는 데이터의 전송이 요구되는 통신에 적합
-UDP는 빠른전송이 필요할 때 적합
TCP 소켓 프로그래밍
클라이언트와 서버간의 일대일 통신이다
서버프로그램이 실행되어 클라이언트 프로그램의 연결요청을 기다리고 있어야 한다
TCP 소켓 프로그래밍의 통신과정
1. 서버 프로그램에서 서버소켓을 사용하여 서버 컴퓨터의 특정 포트에서 클라이언트의 연결요청을 처리할 준비를 한다
2. 클라이언트 프로그램은 접속할 서버의 IP주소와 포트 정보를 가지고 소켓을 생성해서 서버에 연결을 요청한다
3. 서버소켓은 클라이언트의 연결요청을 받으면 서버에 새로운 소켓을 생성해서 클라이언트의 소켓과 연결되도록 한다
4. 클라이언트의 소켓과 새로 생성된 서버의 소켓은 서버소켓과 관계없이 일대일 통신을 한다
서버소켓은 포트와 결합되어 포트를 통해 연결요청을 기다리다가 연결요청이 올 때마다 새로운 소켓을 생성하여 상대편 소켓과 통신할 수 있도록 연결한다
실제적인 데이터통신은 서버소켓과 관계없이 소켓과 소켓간에 이루어진다.
여러 개의 소켓이 하나의 포트를 공유해서 사용할 수 있지만, 서버소켓은 포트를 독점한다.
**두 서버소켓이 서로 다른 프로토콜을 사용하는 경우에는 같은 포트를 사용할 수 있다
->서버소켓은 소켓간의 연결만 처리하고 실제 데이터는 소켓들끼리 서로 주고받는다
소켓들이 데이터를 주고받는 연결통로는 입출력스트림이다
자바에서는 TCP를 이용한 소켓프로그래밍을 위해 Socket과 ServerSocket클래스를 제공한다
Socket과 ServerSocket클래스의 특징
Socket : 프로세스간의 통신을 담당하며, InputStream과 OutputStream을 가지고 있다. 이 두 스트림을 통해 프로세스간의 통신(입출력)이 이루어진다 ServerSocket : 포트와 연결(bind)되어 외부의 연결요청을 기다리다 연결요청이 들어오면, Socket을 생성해서 소켓과 소켓간의 통신이 이루어지도록 한다 한 포트에 하나의 ServerSocket만 연결할 수 있다(프로토콜이 다르면 같은 포트를 공유할 수 있다) |
서버과 클라이언트의 통신과정
1. 서버프로그램(TcplpServer.java)를 실행
2. 서버 소켓을 생성한다
serverSocket = new ServerSocket(7777);
3. 서버소켓이 클라이언트 프로그램의 연결요청을 처리할 수 있도록 대기상태로 만든다
클라이언트 프로그램의 연결요청이 오면 새로운 소켓을 생성해서 클라이언트 프로그램의 소켓과 연결한다
Socket socket = serverSocket.accept();
4. 클라이언트 프로그램(TcplpServer.jave)에서 소켓을 생성하여 서버소켓에 연결을 요청한다
Socket socket = new Socket(“192.168.10.100”, 7777);
5. 서버소켓은 클라이언트 프로그램의 연결요청을 받아 새로운 소켓을 생성하여 클라이언트 프로그램의 소켓과 연결한다
Socket socket = serverSocket.accept();
6. 서버소켓은 클라이언트 프로그램의 연결요청을 받아 새로운 소켓을 생성하여 클라이언트 프로그램의 소켓과 연결한다
ServerSocket클래스의 setSoTimeout(int timeout)을 사용해서 서버소켓의 대기시간을 지정할 수 있다
timeout : 값은 천분의 일초단위이며 0을 입력하면 제한시간 없이 대기한다
지정한 대기시간이 지나면 accept()에서 SocketTimeoutException이 발생한다(catch문에서 처리)
서버에 접속하는 클라이언트의 수가 많을때는 쓰레드를 이용해서 클라이언트의 요청을 병렬적으로 처리하는 것이 좋다
->그렇지 않으면 서버가 접속을 요청한 순서대로 처리하여 늦게 접속을 요청한 클라이언트는 오래 기다려야 한다
UDP소켓 프로그래밍
DatagramSocket와 DatagramPacket을 사용한다
연결지향적이지 않기 때문에 ServerSocket은 불필요하다
DatagramPacket은 헤더와 데이터로 구성되어 있으며, 헤더에는 DatagramPacket을 수신할 호스트의 정보(호스트의 주소와 포트)가 저장되어 있다
->DatagramPacket을 전송하면 지정된 주소의 DatagramSocket에 도착한다