Computer Network Lab UDP 데이터그램 과 소켓 강 동 호 컴퓨터 네트워크 실험실
Computer Network Lab. 2 목차 개요 DatagramPacket 클래스 DatagramSocket 클래스 데이터그램 수신과 송신 소켓 옵션 추상화의 상위수준 유용한 프로그램 요약
Computer Network Lab. 3 개 요개 요 UDP(User Datagram Protocol) 데이터그램 비연결형 데이터 전달 서비스를 제공하는 전달 계층 프로토콜 신뢰성이나 데이터의 전달 순서를 보장하지 않는다. 신뢰성보다 속도가 중요시 되는 데이터의 전송에 이 용 TCP - 전화, UDP - 편지
Computer Network Lab. 4 개 요 (Cont’d) UDP Connection-Less mode Unreliable service TCP Connection-Oriented mode Reliable service
Computer Network Lab. 5 개 요 (Cont’d) UDP 데이터그램 형식 32 비트 데이터 길이체크섬 근원지 포트목적지 포트
Computer Network Lab. 6 개 요 (Cont’d) 자바의 UDP 구현에 필요한 클래스 DatagramPacket 데이터를 데이터그램이라는 UDP 패킷에 채워 넣고, 도착한 데이터그램에서 데이터를 꺼낼수 있도록 한다. DatagramSocket 데이터를 보내고, 받는 역할을 한다.
Computer Network Lab. 7 DatagramPacket 클래스 public DatagramPacket(byte buffer[ ], int length) p 데이터를 받기 위해 DatagramPacket 객체를 만드는 생성자 pbuffer[ ]: 데이터가 위치해 있는 바이트 배열 plength: 버퍼의 길이 (buffer.length 보다 긴 DatagramPacket 을 생성 하려고 하면, lIIegalArgumentException 에러 발생 )
Computer Network Lab. 8 DatagramPacket 클래스 (Cont’d) 데이터를 수신하는 DatagramPacket 생성하기 import java.net.*; public class UDPReceiver { public static void main (String args[ ]) { byte[] buffer = new byte[8096]; DatagramPacket dp = new DatagramPacket(buffer, buffer.length); }
Computer Network Lab. 9 DatagramPacket 클래스 (Cont’d) public DatagramPacket(byte buffer[ ], int length, InetAddress ia, int port) p 다른 호스트로 전송할 DatagramPacket 생성 p buffer[ ]: 전송할 데이터의 바이트 배열 p length: 버퍼의 길이 (buffer.length 보다 큰 length 를 갖는 DatagramPacket 을 생성하려고 하면, IllgalArgumentException 이 발생한다.) p InetAddress ia: 패킷의 목적지 호스트 주소 p Port: 목적지 포트 번호
Computer Network Lab. 10 DatagramPacket 클래스 (Cont’d) 데이터를 보내기 위해 DatagramPacket 을 생성하기 import java.net.*; Public class UDPSender { Public static void main(String args[]) { String s = “this is a test.”; byte[] data = new byte[s.length()]; S.getBytes(0, s.length(),data, 0); try { lnetAddress ia = lnetAddress.getByName(“sunsite.unc.edu”); Int port = 7; DatagramPacket = new DatagramPacket(data, data.length, ia, port); } Catch (UnknownHostException e) { }
Computer Network Lab. 11 get 메소드들 데이터그램의 정보 제공 public InetAddress getAddress( ) 원격호스트의 주소를 가진 InetAddress 객체를 반환 임의의 네트워크로부터 수신된 것이라면, 데이터그램 을 보낸 호스트의 주소를 반환 데이터그램을 전송하기 위해 로컬 호스트에서 생성된 것이라면, 데이터그램이 보내질 호스트의 주소를 반 환
Computer Network Lab. 12 get 메소드들 (Cont’d) public int getPort( ) 원격기계의 데이터그램 포트 번호를 정수로 반환 public byte[] getData( ) 데이터그램 안에 들어있는 데이터들을 바이트 배열로 반환 다른 데이터형 (String 형 ) 으로의 변환 Public String(byte[] buffer, int high_byte, int start, int num_bytes) String s = new String(dp.getData(), 0, 0,dp.getLength()); // 데이터그램에 들어있는 데이터가 아스키 텍스트일 경우
Computer Network Lab. 13 get 메소드들 (Cont’d) Public ByteArrayInputStream(byte[] buffer, int offset, int num_byte) ByteArrayInputStream bis = new ByteArrayInputStream(dp.getData( ), 0, 0, dp.getLength( )); DataInputStream dis = new DataInputStream(bis); // 아스키 텍스트가 아닌 경우 Public int getLength( ) 데이터의 바이트 수 반환
Computer Network Lab. 14 get 메소드들 (Cont’d) 데이터 전송을 위한 DatagramPacket 을 생성하기 String s = "This is a test."; byte[] data = new byte[s.length()]; s.getBytes(0, s.length(), data, 0); try { InetAddress ia = InetAddress.getByName(“netwk.hannam.ac.kr"); int port = 7; DatagramPacket dp = new DatagramPacket(data, data.length, ia, port); System.out.println("This packet is addressed to " + dp.getAddress() + “ on port " + dp.getPort()); System.out.println("There are " + dp.getLength() + " bytes of data in the packet"); System.out.println(new String(dp.getData(), 0, 0, dp.getLength())); }
Computer Network Lab. 15 DatagramSocket 클래스 UDP 에서 데이터그램을 보내거나 받을때 사용 되는 유일한 소켓 클래스 Public DatagramSocket( ) throws SocketException 익명 포트에 바인드 되는 DatagramSocket 을 생성 public static void main(String[] args) { try { DatagramSocket theClient = new DatagramSocket(); } }
Computer Network Lab. 16 DatagramSocket 클래스 (Cont’d) Public DatagramSocket(int port) throws SocketException 지정된 특정 포트에서, 들어오는 데이터그램을 기다 리는 DatagramSocket 생성 객체 생성 실패 원인 지정된 포트가 이미 사용중일 때 1024 번 이하의 포트를 사용하려고 할때 소켓 생성 실패시 SocketException 발생
Computer Network Lab. 17 DatagramSocket 클래스 (Cont’d) Import java.net.*; public class lookForLocalUDPPorts { public static void main(String[ ] args) { DatagramSocket theServer; for (int i = 1024; i <= 65535; i++) { try { theServer = new DatagramSocket(i); theServer.close(); } catch (SocketException e) { System.out.println("There is a server on port " + i + "."); } } }}
Computer Network Lab. 18 DatagramSocket 클래스 (Cont’d) Public DatagramSocket(int port, lnetAddress intf) throws SocketException 지정된 포트와 지정된 네트워크 인터페이스에서 들어오는 데이 터그램을 위해 연결요청을 기다리는 소켓을 생성 Port: 소켓이 데이터그램을 위해 연결 요청을 기다리는 포트 Intf: 호스트의 네트워크 주소중의 하나에 대한 lnetAddress 객체 이다. 자바 1.1 에서만 지원
Computer Network Lab. 19 데이터그램 주고 받기 public void send(DatagramPacket dp) throws IOExecption DatagramPacket 이 생성되고, DatagramSocket 이 열 리면 소켓의 send() 메소드에 패킷을 넘김으로써 데 이터를 전송할 수 있다. theSocket.send(theOutput);
Computer Network Lab. 20 데이터그램 주고 받기 (Cont’d) Public void receive(DatagramPacket dp) throws IOException 네트워크를 통해 수신된 UDP 데이터그램을 DatagramPacket 객체로 변환한다.
Computer Network Lab. 21 데이터그램 주고 받기 (Cont’d) Public int getLocalPort() 로컬기계에서 소켓이 귀를 기울이고 있는 포트의 번 호를 int 로 반환 익명 포트를 사용해서 DatagramSocket 을 생성한 경 우, 사용중인 포트 번호를 알고자 할 때 이 메쏘드를 사용 하면 된다.
Computer Network Lab. 22 데이터그램 주고 받기 (Cont’d) import java.net.*; public class getLocalPortExample { public static void main(String[] args) { try { DatagramSocket ds = new DatagramSocket(); System.out.println("The DatagramSocket is on port " + ds.getLocalPort()); } catch (SocketException e) { }
Computer Network Lab. 23 데이터그램 주고 받기 (Cont’d) Public synchronized void close( ) 소켓이 사용하고 있는 포트의 해제 try { DatagramSocket theServer = new DatagramSocket(); theServer.close(); }
Computer Network Lab. 24 소켓 옵션 ( 자바 1.1) 자바 1.1 에서 데이터그램 소켓에 대해 지원이 되는 소켓 옵션은 SO_TIMEOUT 뿐이다. Public synchronized void setSoTimeout(int timeout) throws SocketException 데이터그램 소켓의 SO_TIMEOUT 필드에 값을 설정한다. receive() 메쏟가 연결 요청 신화를 기다려야하는 시간을 milliseconds 단위로 설정한다. 설정된 시간이 지나면, InterruptedException 이 발생한다. 정해진 시간내에 응답이 와야 하는 보안관련 프로토콜 작성시에 사용된다.
Computer Network Lab. 25 소켓 옵션 ( 자바 1.1) (Cont’d) try { buffer = new byte[2056]; DatagramPacket dp = new DatagramPacket(buffer, buffer.length); DatagramSocket ds = new ServerSocket(2048); ds.setSoTimeout(30000); try { ds.receive(dp);..... } catch (InterruptedExecption e) { ds.close (); System.err.println(" No connection within 30 seconds"); }
Computer Network Lab. 26 소켓 옵션 ( 자바 1.1) (Cont’d) Public synchronized int getSoTimeout() throws IOException getSoTimeout() 메소드는 현재 DatagramSocket 객체 의 SO_TIMEOUT 필드 값을 반환한다. int timeout = ds.getSoTimeout( );
Computer Network Lab. 27 객체 메소드들 Protected synchronized void finalize() DatagramPacket 또는 DatagramSocket 에 의해서 치 환되는 java.lang.Object 의 유일한 메소드 DatagramSocket 객체가 쓰레기 수거되기 전에 호출 된다.
Computer Network Lab. 28 추상화의 상위수준 UDPClient 데이터를 보내기 전에 바이트 배열을 DatagramPacket 객 체로 변환할 필요가 없고, 데이터그램을 수신하기 위해 빈 버퍼를 가진 DatagramPacket 을 생성할 필요도 없다. 인터넷 주소와 포트 번호를 인자로 넘김으로써 UDPClient 객체를 생성한다.
Computer Network Lab. 29 유용한 프로그램 호스트는 패킷의 IP 헤더 부분을 조사해서 TCP 패 킷 인지 UDP 패킷 인지를 판별할수 있다. TCP 서버와 UDP 서버는 아무런 문제없이 같은 포트 번호를 공유할 수 있다.
Computer Network Lab. 30 유용한 프로그램 (Cont’d) 간단한 UDP 클라이언트 몇몇 인터넷 서비스는 클라이언트의 주소와 포트번호 만을 필요로 한다. 서버측에서는 데이터 그램내에 있는 데이터를 그냥 버린다. daytime(13 포트 ),quote(17 포트 ),chargen(19 포트 )
Computer Network Lab. 31 유용한 프로그램 (Cont’d) UDP 서버 하나의 UDP 서버 클래스를 만들어, 특수한 프로토콜 을 구현하는 서버는 서버 클래스로 만드는 개념
Computer Network Lab. 32 유용한 프로그램 (Cont’d) UDP echo 클라이언트 echo 프로토콜을 UDP 로 구현하기 어려운점 I/O 스트림을 지원하지 않는다. 연결이라는 개념이 존재하지 않는다. UDP 에서는 데이터를 보내고 받는 프로세스가 비동 기적으로 이루어져야 한다. => Thread 를 이용 UDPEchoClient, echoInputThread, echoOutputThread 클래스로 구성된다.
Computer Network Lab. 33 유용한 프로그램 (Cont’d) UDPEchoClient 클래스 명령어 입력 라인에서 호스트이름을 읽어 들이고, 소 켓 생성 후 echoInputThread 클래스, echoOutputThread 클래스를 실행시킨다. echoInputThread 클래스 사용자로 부터 입력을 한번에 한줄씩 읽어 들여, 이를 echo 서버에게 전송한다.
Computer Network Lab. 34 유용한 프로그램 (Cont’d) echoOutputThread 클래스 데이터그램이 도착할 때 까지 대기하다가 수신되면, 그것을 String 으로 변환하여 출력한다.
Computer Network Lab. 35 요 약요 약 DatagramPacket 클래스 데이터를 데이터그램이라는 UDP 패킷에 채워 넣고, 도착한 데이터그램에서 데이터를 꺼낼 수 있도록 하 기 위한 DatagramPacket 객체를 생성한다. DatagramSocket 클래스 데이터그램을 송수신하기 위한 DatagramSocket 객 체를 생성한다.