2010. 1. 20.

JNpDp 5장.. Part 1 UDP 받기

UDP에 관련된 부분..
UDP는 일단 패킷의 도착을 담보하지도 않고, 도착했다고 하더라도 그 순서를 맞춰주지도 않는다. 말하자면 상당히 간편한 프로토콜로, 작은 데이터를 많이 보낼 때, 해당 데이터를 일일이 검수하지않아도 된다면 UDP도 괜찮은 요소..

UDP에서 핵심되는 부분은 다음의 두 클래스임..
  • java.net.DatagramPacket
  • java.net.DatagramSocket
DatagramPacket은 소켓으로 들어온 데이터를 받는 곳으로, 생성자는 각기 데이터를 넣을 배열과 그 크기를 주어서 보낸다.

DatagramPacket dp = new DatagramPacket(new byte[1024], 1024);

처럼 되어 있는 부분을 Clojure에서는 이렇게 한다.

(java.net.DatagramPacket. (make-array (Byte/TYPE) 4096) 4096)

사실 DatagramPacket을 만들때마다 새로 버퍼를 구성해야할 필요는 없으니까..

(let [buffer (make-array (Byte/TYPE) 4096)
     datagram (java.net.DatagramPacket. buffer 4096)]
...)


정도로 구성하면 된다.

DatagramSocket의 경우 생성자에서 port랑 address를 필요로 한다. address가 생략되면 localhost를 쓴다.

(let [socket (java.net.DatagramSocket. 9999 "127.0.0.1")]
...)


식으로 구성해서 해당 소켓을 이용하면 OK..

UDP 패킷을 읽어오는 Java 프로그램은 이렇다.

DatagramPacket packet = new DatagramPacket(new byte[256], 256);
DatagramPacket socket = new DatagramSocket(2000); // localhost 포트 2000 을 이용함

while(! end_of_work) {
  socket.receive( packet );
  // do other job
}
socket.close();

이것을 Clojure로 변형하면..

  (let [socket (java.net.DatagramSocket. 2000)
        packet (java.net.DatagramPacket. (make-array (Byte/TYPE) 256) 256)
        end_of_work false]
    (do (while (not end_of_work)
          (. socket receive packet)
          ; do other thing
          )
        (. socket close)))


쯤 될 것이다.

테스트용 스크립트는 다음과 같다


(defn test_udp_server []
  (let [socket (java.net.DatagramSocket. 2002)
        packet (java.net.DatagramPacket. (make-array (Byte/TYPE) 256) 256)
        end_of_work false]
    (do
      (. socket receive packet)
      (println (str "Send By : " (.. packet getAddress getHostAddress)))
      (println (str "Sent from : " (. packet getPort)))
      (let [bin (new java.io.ByteArrayInputStream (. packet getData))
            blength (. packet getLength)]
        (println (. bin read)))
      (. socket close))))
해당 스크립트를 실행시키고 hping으로 UDP 데이터를 날려본다.

 sudo hping3 localhost --udp -V -p 2002
정상적으로 실행되면 UDP 1차 테스트는 완료..



댓글 없음:

댓글 쓰기