UDP에 관련된 부분..
UDP는 일단 패킷의 도착을 담보하지도 않고, 도착했다고 하더라도 그 순서를 맞춰주지도 않는다. 말하자면 상당히 간편한 프로토콜로, 작은 데이터를 많이 보낼 때, 해당 데이터를 일일이 검수하지않아도 된다면 UDP도 괜찮은 요소..
UDP에서 핵심되는 부분은 다음의 두 클래스임..
처럼 되어 있는 부분을 Clojure에서는 이렇게 한다.
사실 DatagramPacket을 만들때마다 새로 버퍼를 구성해야할 필요는 없으니까..
정도로 구성하면 된다.
DatagramSocket의 경우 생성자에서 port랑 address를 필요로 한다. address가 생략되면 localhost를 쓴다.
식으로 구성해서 해당 소켓을 이용하면 OK..
UDP 패킷을 읽어오는 Java 프로그램은 이렇다.
이것을 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)))
쯤 될 것이다.
테스트용 스크립트는 다음과 같다

UDP는 일단 패킷의 도착을 담보하지도 않고, 도착했다고 하더라도 그 순서를 맞춰주지도 않는다. 말하자면 상당히 간편한 프로토콜로, 작은 데이터를 많이 보낼 때, 해당 데이터를 일일이 검수하지않아도 된다면 UDP도 괜찮은 요소..
UDP에서 핵심되는 부분은 다음의 두 클래스임..
- java.net.DatagramPacket
- java.net.DatagramSocket
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 []해당 스크립트를 실행시키고 hping으로 UDP 데이터를 날려본다.
(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))))
sudo hping3 localhost --udp -V -p 2002정상적으로 실행되면 UDP 1차 테스트는 완료..

댓글 없음:
댓글 쓰기