본문 바로가기

JAVA/JAVA

네트워크 프로그래밍의 개념과 TCP방식과 UDP 방식

반응형

** 네트워크 프로그래밍

: 멀리 떨어진 두 대 이상의 컴퓨터가 서로 데이터를 주고 받는 프로그래밍


네.프를 하기 위해 알아야 할 것들

ip 주소

port 번호

: 하나의 컴퓨터가 동시에 여러개의 네트워크 프로그램이 실행이 될 수 있기 때문에 프로그램을 구별할 수 있는 식별자 필요




** 네트워크와 관련한 프로그래밍

: java.net


** URL(Uniform Resource Locator)

: 인터넷 상의 특정 문서(자원)의 정보를 나타내는 클래스


** InetAddress

: 인터넷상의 주소의 정보를 관리하는 클래스


인터넷상의 주소 = ip Address 203.236.209.111 (예)

안터넷상의 수많은 컴퓨터들 중에 구별하기 위한 식별자


도메인 네임 = www.naver.com





** 네트워크 상에서 데이터를 주고 받는 방식(크게 두가지)


1. TCP 방식

: 먼저 통신을 할 두 대의 컴퓨터가 연결이 된 상태에서 데이터를 주고 받는 방식

연결을 먼저 맺어놓고 연결된 회선을 통해 데이터를 주고 받는 방식

이 경우에는 신뢰성이 보장되지만 네트워크에 부담이 될 수 있다.

현실에서는 전화기에 비유를 한다.


2. UDP 방식

: 통신을 할 상대의 컴퓨터와 연결이 되지 않는 상태에서 데이터를 막 보내는 방식

그래서 데이터마다 목적지의 주소를 안고 가야 함. 패킷(목적지(주소)를 포함한 것) 단위로 데이터를 주고 받는 형식

이 경우에는 신뢰성이 보장 되지 않지만 네트워크에 부담은 줄일 수 있다.

현실에서의 편지에 비유를 한다.




** 자바가 각각의 방식을 위해 제공하는 것이 있음

1. TCP 제공 클래스

ServerSocket

Socket


2. UDP 제공 클래스

DatagramSocket

DatagramPacket





** Server 와 Client, Socket 의 정의


Server

: 네트워크상에서 서비스를 제공하는 컴퓨터 혹은 프로그램

Client

: 네트워크상에서 서비스를 제공받는 컴퓨터 혹은 프로그램

Socket

: 데이터를 주고 받기 위한 연결 접점이 이루어 지는 곳





<다음을 연구해 보기>


진짜 채팅이 되려면

1. Receiver는 Sender가 보내온 데이터를 그대로 Sender한테 다시 보내 주도록 합니다. 메아리 치도록 합니다.


2. Sender는 자신이 보낸 메세지를 Receiver가 다시 보내온 메세지를 받아서 출력합니다.




**TCP 방식으로 네트워크 프로그램 하는 방식 

1. ServerSocket을 생성한다 ==> 서버

다른 프로그램과 구별할 port번호를 정해서 서버소켓을 생성한다.

Client가 접속할 때 까지 무한대기상태여야 한다.


2. Client 쪽에서는 서버가 정한 port번호와 서버의 ip 주소를 갖고 Socket 객체를 생성한다.

Client가 server하고 통신하고 싶다고 요청하는 것


3. server는 통신하자는 의미로 요청을 수락한다.

수락을 하는 순간 Socket을 생성한다.

그래서 Server의 socket과 Client가 요청한 socket 끼리 데이터를 주고 받는다.

데이터를 주고 받을 때는 Stream으로 해야 자료를 주고 받을 수 있음.

각각의 socket이 Stream을 생성하여 데이터를 주고 받는다.

주고 받는 것이 끝나면 각자를 close 한다.



**UDP 방식으로 네트워크 프로그램 하는 방식


1. 데이터를 받는 측에서 DatagramSocket을 생성한다.

==> 다른 프로그램과 구별하기 위한 port번호를 정함


2. 데이터를 보내는 측에서 DatagramSocket을 생성한다.

==> 보내고자 하는 데이터와 목적지의 주소를 갖는 DatagramPacket을 생성한다.

DatagramSocket을 통해 데이터를 보낸다.


3. 데이터를 받는 측에서는 데이터를 보내는 측에서 보내온 데이터를 DatagramPacket 단위로 데이터를 받는다.

packet으로부터 실데이터만 추출하여 (어떠한)처리한다.


** TCP 방식에서는 서버가 가동되지 않은 상태에서 클라이언트 프로그램을 실행 할 수 없다.

그러나, UDP 방식에서는 데이터를 받는측이 실행되지 않아도 데이터를 보내는 측의 프로그램을 실행할 수 있다.

하지만 보낸 데이터는 유실된다.




TCP 예제


/*

TCP 방식을 위한 자바가 제공하는 클래스

ServerSocket

Socket

*/



// TCP Server 코드

import java.net.*;

import java.io.*;


class  TCPServer{

public static void main(String[] args) {

try{

// 생성

ServerSocket server = new ServerSocket(9000);

// 대기

while(true){

Socket sc = server.accept(); //데이터소켓 : 클라이언트와 주고 받을 소켓

System.out.println("클라이언트가 접속함");


Thread.sleep(1000); // 의도적으로 딜레이 시켜보기


// 접속한 클라이언트한테 1~10까지의 정수를 내보내도록 해보자

OutputStream os = sc.getOutputStream();


for(int i =1; i <= 10; i++){

os.write(i);

}


os.close();

sc.close();

}


}catch(Exception e){

System.out.println(e);

}

}

}


// TCP Client 코드

import java.net.*;

import java.io.*;


class  TCPClient{

public static void main(String[] args) {

try{

//Socket 객체 생성 = 서버요청

Socket sc = new Socket("203.236.209.141",9000); // 호스트:ip주소


InputStream is = sc.getInputStream();


for(int i = 1; i<10; i++){

int n = is.read();

System.out.println("서버한테 받은 데이터" + n);

}


is.close();

sc.close();


}catch(Exception e){

System.out.println(e);

}

}

}





UDP 예제



// UDP Sender 코드

import java.net.*;


// java UDPSender 203.236.209.141 hello?


class UDPSender {

public static void main(String[] args) {

try{

DatagramSocket ds = new DatagramSocket(); // 밑에 포트번호를 주기 때문에 생성할때 포트번호가 의미없어서 삭제함

// 데이터는 메인메소드의 String에 쌓임

String ip = args[0]; 

String data = args[1];


// String 클래스에 byte를 반환하는 getByte를 이용

byte buf[] = data.getBytes();

InetAddress addr = InetAddress.getByName(ip);


// 보내고자 하는 데이터와 목적지의 주소, 포트번호를 갖고 DatagramPacket으로 포장

// 형식 : DatagramPacket(byte[] buf, int length, InetAddress address, int port)

DatagramPacket dp = new DatagramPacket(buf, buf.length, addr, 9001); // 배열의 길이는 ()없음, 문자열의 길이만 함


//DatagramSocket을 이용해 보낸다.

ds.send(dp);

ds.close();


}catch(Exception e){

System.out.println(e);

}

}

}





// UDP Receiver 코드


/*

UDP 방식을 위하여 자바가 제공하는 클래스

DatagramSocket

DatagramPacket


목적지의 주소, 데이터만 가도록함(포트번호는 생략)

java UDPSender 203.236.209.141 hello?

*/


import java.net.*;


class  UDPReceiver{

public static void main(String[] args) {

// 생성할때 port번호 필요

try{

DatagramSocket ds = new DatagramSocket(9001);


while(true){

byte []buf = new byte[100];


// DatagramPacket을 생성해야함

// DatagramPacket(byte[] buf, int length)

// 데이터 받는 것이기 때문에 목적지가 필요없음

// 데이터 받을 단위만 만들어 놓은 것임

DatagramPacket dp = new DatagramPacket(buf, buf.length);


// 데이터를 실제 받을 것을 만들어야 함

ds.receive(dp);

InetAddress addr = dp.getAddress(); // 데이터를 보낸측의 주소를 확인


String msg = new String(buf);

System.out.println( addr + "==>" + msg);

}


}catch(Exception e){

System.out.println(e);

}

}

}



반응형

'JAVA > JAVA' 카테고리의 다른 글

체크박스 배열 두가지 차이  (0) 2016.06.18
GUI의 java.awt 와 javax.swing 에 설명 및 사용법 차이  (0) 2016.06.18
GUI 에 대한 설명  (0) 2016.06.18
CUI 와 GUI 개념 차이  (0) 2016.06.18
쓰레드 사이의 통신  (0) 2016.06.18