1. 네트워크 기초
-> 네트워크(network)는 여러 대의 컴퓨터를 통신 회선으로 연결한 것을 말한다.
-> 지역네트워크는 회사, 건물, 특정 영역에 존재하는 컴퓨터를 통신 회선으로 연결한 것을 말하고, 인터넷(internet)은 지역 네트워크를
통신 회선으로 연결한 것을 말한다.
1-1. 서버와 클라이언트
-> 컴퓨터가 인터넷에 연결되어 있다면 실제로 데이터를 주고받은 행위는 프로그램들이 한다.
-> 서비스를 제공하는 프로그램을 일반적으로 서버(server)라고 부른다.
-> 서비스를 받는 프로그램을 클라이언트(client)라고 부른다.
1-2. IP 주소와 포트(Port)
-> IP주소 : 집주소로 우편물이나 택배가 오듯이 컴퓨터의 고유한 주소가 IP이다. (Internet Protocol)
-> Port : IP는 컴퓨터의 네트워크 어댑터까지만 갈 수 있는 정보이기 때문에 컴퓨터 내에서 실행하는 서버를 선택하기 위해서는 추가적인정보를 말한다.
->서버일경우 시작할때 고정적인 포트 번호를 가지고 실행하는데, 이것을 포트 바인딩(binding)이라고 한다.
1-2-1 포트번호
-> 포트 번호의 전체 범위는 0~65535인데, 다음과 같이 세 가지 범위로 구분된다.
구분명 |
범위 |
설명 |
Well Know Port Numbers |
0~1023 |
국제인터넷주소관리기구(ICANN)가 특정 애플리케이션용으로 미리 예약한 포트 |
Registered Port Numbers |
1024 ~ 491151 |
회사에서 등록해서 사용할 수 있는 포트 |
Dynamic Or Private Port Numbers |
49152 ~ 65535 |
운영체제가 부여하는 동적 포트 또는 개인적인 목적으로 사용할 수 있는 포트 |
1-3. InetAddress로 IP주소 얻기
-> 자바는 IP주소를 java.net.InerAddress 객체로 표현한다.
-> InetAddress는 로컬 컴퓨터의 IP주소 뿐만 아니라 도메인 이름을 DNS에서 검색한 후 IP 주소를 가져오는 기능을 제공한다.
ex)
InetAddress ia = InetAddress.getLocalHost();
ex1)
InetAddress ia = InerAddress.getByName(String host);
//getByName() 메소드는 매개값으로 준 도메인 이름으로 DNS에서 단 하나의 IP 주소를 얻어와 InetAddress를 생성하고 리턴한다.
InetAddress[] iaArr = InetAddress.getAllByName(String host);
ex2)
String ip = InetAddress.getHostAddress();
------------------------------------------------------------------------------------------------------------------------------------------
//IP주소 얻기
package jongkyu.example;
import java.net.InetAddress;
import java.net.UnknownHostException;
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 (UnknownHostException e) {
e.printStackTrace();
}
}
}
------------------------------------------------------------------------------------------------------------------------------------------
1-4. TCP 네트워킹
TCP(Transmission Control Protocol)
-> 연결 지향적 프로토콜이다.
-> 연결 지향 프로토콜이란 클라이언트와 서버가 연결된 상태에서 데이터를 주고받은 프로토콜을 말한다.
-> java에서 java.net.ServerSocket과 java.net.Socket 클래스를 제공하고 있다.
1-4-1. ServerSocket과 Socket의 용도
TCP 서버의 역할
1) 클라이언트가 연결 요청을 해오면 연결을 수락하는 것이다.
ex) java.net.ServerSocket 클래스
2) 연결된 클라이언트와 통신하는 것이다.
ex) java.net.Socket 클래스
1-4-2. ServerSocket 생성과 연결 수락
-> 서버를 개발하려면 우선 ServerSocket 객체를 얻어야 한다.
-> 얻는 가장 간단한 방법은 생성자에 바인딩 포트를 대입하고 객체를 생성하는 것이다.
ex)
ServerSocket serverSocket = new ServerSocket(5001);
//5001번가진 ServerSocket을 얻겠다.
ex2)
ServerSocket serverSocket = new ServerSocket();
serverSocket.bind(new InetSocketAddress(5001));
//디폴트 생성자로 객체를 생성하고 포트 바인딩을 위해 bind()메소드를 호출한 것이다. Bind() 메소드의 매개값은 포트 정보를 가진 InetSocketAddress이다.
ex3)
ServerSocket serverSocket = new ServerSocket();
serverSocket.bind(new InetSocketAddress("localhost",5001));
//만약 서버 PC에 멀티 IP가 할당되어 있을 경우, 특정 IP로 접속할때만 연결 수락을 하고 싶다면 localhost대신 IP를 주면 된다.
리턴 타입 |
메소드명(매개 변수) |
설명 |
String |
getHostName() |
클라이언트 IP 리턴 |
int |
getPort() |
클라이언트 포트 번호 리턴 |
String |
toString() |
"IP:포트번호" 형태의 문자열 리턴 |
※ 클라이언트 연결 수락이 필요 없으면 ServerSocket의 close() 메소드를 호출해서 포트를 인바이딩 시켜야한다.
ex) serverSocket.close();
------------------------------------------------------------------------------------------------------------------------------------------
이 소스일 경우 서버가 소켓을 열어놓고 기다리고 있는 상태이다.
package jongkyu.example;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerExample {//연결수락
public static void main(String[] args) {
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket();//ServerSocket 생성
serverSocket.bind(new InetSocketAddress("localhost",5001));//ServerSocket 생성
while(true) {
System.out.println("[연결 기다림]");
Socket socket = serverSocket.accept();
//클라이언트 연결 수락
InetSocketAddress isa = (InetSocketAddress) socket.getRemoteSocketAddress();
//실제 리턴되는것은 InetSocketAddress 객체이므로 다음과 같이 타입변환을 해줘야 한다.
System.out.println("[연결 수락함]"+isa.getHostName());
}
} catch (Exception e) {
// TODO: handle exception
}
if(!serverSocket.isClosed()) {//ServerSocket이 닫혀있지 않을 경우
try {
serverSocket.close();//ServerSocket 닫기
}catch (IOException e) {
e.printStackTrace();
}
}
}
}
------------------------------------------------------------------------------------------------------------------------------------------
1-4-3. Socket 생성과 연결 요청
-> 클라이언트가 서버에 연결 요청을 하려면 java.net.Socket을 이용해야 한다.
ex)
try{
Socket socket = new Socket("localhost",5001);//1번방법
Socket socket = new Socket(new InetSocketAddress("localhost",5001));//2번방법
}catch (UnknownHostException e){
//IP 표기 방법이 잘못되었을 경우
}catch (IOException e){
//해당 포트의 서버에 연결할 수 없는 경우
}
------------------------------------------------------------------------------------------------------------------------------------------
package jongkyu.example;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
public class ClientExample {
public static void main(String[] args) {
Socket socket=null;
try {
socket = new Socket(); //Socket 생성
System.out.println("[연결 요청]");
socket.connect(new InetSocketAddress("localhost",5001));//연결 요청
System.out.println("[연결 성공]");
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
if(!socket.isClosed()) {
try {
socket.close();//연결 끊기
}catch (IOException e) {
}
}
}
}
'IT일반과목 > java' 카테고리의 다른 글
네트워크 수업2 (0) | 2018.08.09 |
---|---|
네트워크 수업1 (0) | 2018.08.09 |
직렬화 역직렬화 (집공부) (0) | 2018.08.08 |
20180808 학원에서 네트워크 들어가기전에 개념 설명,직렬화 (0) | 2018.08.08 |
자바 IO 수업3 (0) | 2018.08.08 |