2010. 1. 22.

JNpDp 5장 Part2 UDP 보내기..

UDP를 보내기 위한 방법이다. UDP를 보내기 위해서도 DatagramSocket과 DatagramPacket이 모두 필요하다.
단 이때 DatagramPacket에 받을 곳의 주소와 포트를 등록해야한다.

이 때 주소는 java.net.InetAddress 형식이다.
따라서 packet을 만드는 방법은 다음과 같다.

(defn test_udp_send []
  (let [socket (new java.net.DatagramSocket)
        remote (. java.net.InetAddress getByName "127.0.0.1")
        bout (new java.io.ByteArrayOutputStream)
        pout (new java.io.PrintStream bout)]
    (do
      (. pout print "Greetings!")
      (let [barray (. bout toByteArray)
            packet (new java.net.DatagramPacket barray (. bout size))]
        (do
          (. packet setAddress remote)
          (. packet setPort 2002)
          (. socket send packet)))
      (. socket close))))

위에서 remote를 만드는 방법을 보면
remote (. java.net.InetAddress getByName "127.0.0.1")
처럼 만들었다. 즉 해당하는 주소는 InetAddress형으로 만들어야 한다는 것..
DatagramPacket을 생성할 때에는 해당하는 Byte Array와 그 길이를 돌려주어야한다. 문제는 byte[] 의 길이를 가져올 방법이 없었다. 그래서 할 수 없이 원 소스인 bout을 이용해서 해당하는 길이를 구했다. 메서드를 실행하는 방법은 쉬운데.. 멤버 변수를 가져올 방법이 없다. 구글링을 해봤는데 찾을 수가 없었음.. =.=

기타 나머지 부분은 UDP 받기에서 했었던 내용이므로 여기서는 패스~

마지막으로 UDP 보내기 부분을 조금 수정했다. 아래가 수정한 내용..

(defn read_from_stream [stream]
  (loop [s (. stream read)]
    (if (not (== s 0))
      (do
        (print (char s))
        (recur (. stream read))))))

(defn test_udp_receive []
  (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)]
        (read_from_stream bin))
      (. socket close))))

조금 허접하지만.. 그래도 어느 정도 완성된 것이라고 자위..



댓글 없음:

댓글 쓰기