2013년 2월 19일 화요일

[Java] UDP

UDP 프로토콜?

  • UDP는 DatagramSocket 와 DatagramPacket를 사용하여 데이터를 전송한다는 것만 알면 됩니다.
  • DatagramSocket은 DatagramPacket를 전송하거나 수신 받기 위해 사용 합니다.
  • DatagramPacket은 UDP 통신에서 데이터를 담아서 전송하거나 받기 위해 사용 합니다.

◆ 장점
  • 복잡하지 않음
  • 시스템 로드를 줄일 수 있음
  • 빠름

◆ 단점
  • 데이타 손실이 있을 수 있음
Client 예제
public class BroadClient {
 public BroadClient() {
  new Thread(new ReadThread()).start();
 }

 class ReadThread implements Runnable {
  DatagramSocket ds = null;
  DatagramPacket packet = null;
  byte[] brr = new byte[200];

  public void run() {
   try {
    ds = new DatagramSocket(12345); // 서버 port를 맞춘다.
    packet = new DatagramPacket(brr, brr.length);// brr : 데이터그램 패킷을 수신할 바이트 배열, brr.length:데이터그램 수신 크기.
    while (true) {
     ds.receive(packet); // 블럭 되어 있는 부분.
     System.out.println("받은 문자열 : "+ new String(packet.getData())); // 바이트로 받은 내용을 문자로바꾼다.
     System.out.println(packet.getAddress().getHostAddress());// 보낸사람 address를 알 수 있다.
     Thread.yield();
    }
   } catch (Exception e) {
    System.out.println("받기 오류 :" + e);
    e.printStackTrace();
   }
  }
 }

 public static void main(String[] args) {
  new BroadClient();
 }
}

  • 수신받는 부분의 DatagramPacket 부분입니다. packet = new DatagramPacket(brr, brr.length)
  • ds.receive(packet) 부분이 Server에서 데이타를 받는 부분입니다. 데이터를 받을때까지 블럭 되어있습니다.

Server 예제
public class BroadServer {
 boolean onAir = false;
 DatagramSocket ds;
 DatagramPacket packet;
 int port = 12345;// 받을 사람 port // 상용화 포트(1024 ~ 10000)

 InetAddress address;

 public BroadServer() {
  HowServer server = new HowServer();
  Thread trd = new Thread(server);
  onAir = true;
  trd.start();
 }

 static class Unse {
  static Random ran = new Random();
  static final String[] arr = { "오늘은 모든 일이 잘 풀릴것 같음.",
    "비가 올 것 같이 기분이 좋지 않음.", "안드로이드 공부 중.", "xml 중요.",
    "프로젝트 준비 철저.", "마무리를 잘하자!!" };

  static String getUnse() {
   return arr[ran.nextInt(arr.length)];
  }
 }

 class HowServer implements Runnable {
  String data;
  byte[] brr;

  public void run() {
   try {
    ds = new DatagramSocket();
    address = InetAddress.getByName("127.0.0.1");// 서버 주소
   } catch (Exception e) {
    e.printStackTrace();
   }
   try {
    while (onAir) {
     data = Unse.getUnse(); // 운세의 내용을 가져온다.
     brr = data.getBytes(); // String을 byte 배열로 만들기.
     packet = new DatagramPacket(brr, brr.length, address, port); // 배열, 배열길이, 주소, 포트번호.
     ds.send(packet);
     System.out.println("서버전송 문자열 :" + data);
     Thread.sleep(1000);
    }
   } catch (Exception e) {
    System.out.println("서버생성 오류 :" + e);
    e.printStackTrace();
   }
  }
 }

 public static void main(String[] args) {
  new BroadServer();
 }
}
  • 전송하는 부분의 DatagramPacket 부부입니다.packet = new DatagramPacket(brr, brr.length, address, port)
  • ds.send(packet) 부분이 Client로 데이타를 보내는 부분입니다.
UDP는 특별한 내용이 없습니다. DatagramSocket 와 DatagramPacket를 사용하며 send()로 보내며 receive()로 받는 다는 것만 기억하시면 됩니다.

관련글
  1. [Java] TCP
  2. [Java] 객체 저장(OutputStream, inputStream, BufferStream)

댓글 없음:

댓글 쓰기