본문 바로가기

IT일반과목/java

네트워크 기초 (집공부)

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) {

}

}

}

}


=================================
위에있는 ServerExample와 같이 실행을 해보자!!!!!!!
=================================


'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