ååãçªç¶TCPãœã±ããã䜿ã£ãEcho ServerãæžããŸããããåé ã«ã¡ããã£ãšè¿°ã¹ãŠããŸããããã³ãã¯UDPãœã±ããã䜿ã£ãŠã¿ããã£ãã®ã§ããã
ãªã«ããšèšããŸããšãæè¿InfinispanïŒJGroupsïŒã¿ãããªãã«ããã£ã¹ãã䜿ã£ãããŒããã£ã¹ã«ããªãè¡ãããã«ãŠã§ã¢ãšãã䜿ã£ãŠãããšããããããUDPãç¥ã£ãŠããæ¹ããããªãïŒãšæãå§ããŠããããšããã£ããã§ãã
ãããŸã§ã«ãããã€ããããã¯ãŒã¯ããã°ã©ãã³ã°ã®å匷ããããæ¬ãè²·ã£ããã¯ããŠããŸããããã ãããUDPã¯ãããŸãèå³ãªããŠãããã£ãšæµããŠããé£ã°ãããããŠããããŠããããšãå€ãã£ãã®ã§âŠã
ã¡ãã£ãšæŽæ°ããŒã¹ã¯ã€ãã€ããããããŸããããã¡ãã£ãšãã€å匷ããŠããããšæããŸãã
ã§ãããã°ã©ã ã¯Clojureã§æžããŸãããããŠãåååæ§ããã§ãã¯ã®æå³ã蟌ããŠScalaã§ã®ãªã©ã€ãçãæ²èŒããæãã§ã
ã§ã¯ããŸãç°¡åãªUDPãµãŒããåããšããŠã¯ãåã®Echo Serverã®ç°¡æççãªãã®ã§ã
- å ¥åãããæåã«ãYou Say => ãããã£ã€ããŠãã¯ã©ã€ã¢ã³ãã«éä¿¡ãã
- ã¯ã©ã€ã¢ã³ãã®æ¥ç¶ããšã«ããã«ãã¹ã¬ããã§åäœãã
ãšããã ããããããã«ããŸãã
ããã§ããããããšæåãä»ã足ããŠè¿åŽãããšãããšãããå ¥ãããããã§ãã ããã¶ãŠããããŸããã
ã§ã¯ãããã°ã©ã ã®æ¹ãã
udp_server.clj
(import '(java.net DatagramPacket DatagramSocket InetSocketAddress) '(java.util Date)) (require '[clojure.string :as str]) (defn log [word & more-words] (println (str \[ (Date.) \] \ (str/join \ (conj more-words word))))) (let [address (InetSocketAddress. 50000)] (with-open [socket (DatagramSocket. address)] (log "Simple Clojure UDP Server" address "Startup.") (letfn [(receive [] (let [buffer (byte-array 8192) packet (DatagramPacket. buffer (alength buffer))] (.receive socket packet) packet)) (accepted-client [s p] (let [data (.getData p) offset (.getOffset p) length (.getLength p) word (String. data offset length "UTF-8") reply-word (str "You Say => " word) reply-word-binary (.getBytes reply-word "UTF-8")] (.setData p reply-word-binary 0 (alength reply-word-binary)) (.send s p)))] (doseq [packet (repeatedly receive)] (log "Accept Client" "=>" (.getSocketAddress packet)) (.start (Thread. #(accepted-client socket packet)))))))
UDPãœã±ããã䜿ã£ãäž»ãªç»å Žäººç©ã¯ã
- DatagramSocket
- DatagramPacket
ã«ãªããŸãããŸããã³ãã¯ã·ã§ã³ã¬ã¹ãªã®ã§ãæ¥ç¶ãäœã£ããçµäºããå¿ èŠããªãããšãç¹åŸŽã ãããªãâŠäžå¿ãDatagramSocketã«closeã¡ãœãããããã®ã§ãåŒã³åºãããã«ã¯ããŠããŸããã
UDPã¯ã¹ããªãŒã ããŒã¹ã®ãããã³ã«ã§ã¯ãªãã®ã§ãDatagramPacketãäœæããæã®ãããã¡ãµã€ãºãéèŠã§ãããä»åã¯ã8,192ãã€ãã«ããŠããŸããã
(let [buffer (byte-array 8192) packet (DatagramPacket. buffer (alength buffer))]
ã¯ã©ã€ã¢ã³ãããã®æ¥ç¶ã¯ãDatagramSocket#receiveã§åŸ ã¡åããŸãã
(.receive socket packet)
ãŸããéä¿¡ãããããŒã¿ã¯ãDatagramPacket#getDataã¡ãœããã§byteé åã§åãåãããã®ãªãã»ãããšé·ãã¯ããããgetOffsetãgetLengthã¡ãœããã§ååŸããŸãã
(let [data (.getData p) offset (.getOffset p) length (.getLength p) word (String. data offset length "UTF-8")
ä»åã¯ãæååãšããŠåããåæãªã®ã§ããã®å€ããã®ãŸãŸäœ¿ã£ãŠStringãæ§ç¯ããŠããŸãã
ã§ãããã«è¿œå ã®æååããã£ã€ããŠ
reply-word (str "You Say => " word) reply-word-binary (.getBytes reply-word "UTF-8")]
DatagramPacket#setDataã«ãªãã»ãããšé·ããšäžç·ã«èšå®ã
(.setData p reply-word-binary 0 (alength reply-word-binary))
ããã§ãã¯ã©ã€ã¢ã³ãããèŠãæã®DatagramPacket#getLengthãããµãŒãããæ»ãããbyteé åã®é·ãã«ãªããŸãã
ã§ãéä¿¡ã
(.send s p)))]
ç¶ããŠãã¯ã©ã€ã¢ã³ãåŽã
udp_client.clj (import '(java.net DatagramPacket DatagramSocket InetSocketAddress)) (let [address (InetSocketAddress. 50000)] (with-open [socket (DatagramSocket.)] (let [word "Hello, Simple UDP Client!!" word-binary (.getBytes word "UTF-8") buffer (byte-array 8192)] (System/arraycopy word-binary 0 buffer 0 (alength word-binary)) (let [packet (DatagramPacket. buffer 0 (alength word-binary) address)] (.send socket packet) (.setLength packet 8192) (.receive socket packet) (println (String. (.getData packet) (.getOffset packet) (.getLength packet) "UTF-8"))))))
çãã§ãããŒãè¶ ããããŸãããã©âŠã
ã¯ã©ã€ã¢ã³ãåŽããDatagramSocketãäœæããŸãã
(with-open [socket (DatagramSocket.)]
ãããã¡ãã¯ã¢ãã¬ã¹ç³»ã®æ å ±ã¯æå®ããŸãããã¡ãã£ãšãããŒçãªãšããããããŸãã
ãšãããããéä¿¡ããããŒã¿ãäœæããŠ
(let [word "Hello, Simple UDP Client!!" word-binary (.getBytes word "UTF-8") buffer (byte-array 8192)] (System/arraycopy word-binary 0 buffer 0 (alength word-binary))
éä¿¡ã
(let [packet (DatagramPacket. buffer 0 (alength word-binary) address)]
ããã§ãå®å ã®ã¢ãã¬ã¹ãæå®ããŠããŸãã
ã§ããµãŒãããæ»ã£ãŠããããŒã¿ã¯ãéä¿¡ããããŒã¿ããé·ãå¯èœæ§ãããïŒãšããããé·ãïŒã®ã§ãé·ããåºããŠãããŸãã
(.setLength packet 8192)
ããšã¯ãDatagramSocket#receiveããã ãã§ããã
(.receive socket packet)
ããã§ãã¡ãããšé·ããèããªããšãããªããšããDatagramPacketãäœã£ãæã®byteé åã®é·ãã«ããããäŸåãããšããæåããã£ãŠãªããŠãããããããããŸããããŸããå·éã«èãããšããããããã ããªãã£ãŠæãã§ããã
ã€ããåä¿¡ãšéä¿¡ã§DatagramPacketãå¥ã«ããŠãããã£ãã§ãããã
åä¿¡ããããŒã¿ã¯ããã¡ããStringã«ããŠããã ãã§ãã
(println (String. (.getData packet) (.getOffset packet) (.getLength packet) "UTF-8"))))))
UDPãœã±ããã®å匷ã«ã¯ããã¡ãã®æžç±ã䜿ã£ãŠããŸãã
Javaãããã¯ãŒã¯ããã°ã©ãã³ã°ã®çé«
- äœè : ãšãºã¢ã³ãã»ããã,岩谷å®
- åºç瀟/ã¡ãŒã«ãŒ: ãœãããã³ã¯ ã¯ãªãšã€ãã£ã
- çºå£²æ¥: 2007/04/28
- ã¡ãã£ã¢: 倧åæ¬
- è³Œå ¥: 9人 ã¯ãªãã¯: 100å
- ãã®ååãå«ãããã° (25件) ãèŠã
ãããããé 匵ã£ãŠå匷ããŸãããã
ã§ãèªåã®ç解ã®ç¢ºèªãšClojureã§æžãããšããã®ç¹æ€ã®æå³ãå«ããŠãScalaã§æžãçŽããŠããã®ã§ãã¡ãã貌ã£ãŠãããŸãã
è¡ã£ãŠããããšã¯ã»ãŒåããªã®ã§ã説æã¯å²æã§ããClojureæ £ãããŠããªã人ã¯ããã¡ãã®æ¹ããŸã èªã¿ãããããªâŠã
ããã¯ã©ã€ã¢ã³ããšãµãŒãã¯åããã¡ã€ã«ã«æžããŠããŸãã
UdpClientServer.scala
import java.net.{DatagramPacket, DatagramSocket, InetSocketAddress} import java.nio.charset.StandardCharsets import java.util.Date import UdpHelper._ object UdpHelper { implicit class AutoCloseableWrapper[A <: AutoCloseable](val underlying: A) extends AnyVal { def foreach(fun: A => Unit): Unit = try { fun(underlying) } finally { underlying.close() } } def log(msgs: Any*): Unit = println(s"[${new Date}] ${msgs.mkString(" ")}") } object UdpServer { def main(args: Array[String]): Unit = { val address = new InetSocketAddress(50000) for (socket <- new DatagramSocket(address)) { log("Simple Scala UDP Server", address, "Startup.") Iterator .continually { val packet = new DatagramPacket(Array.ofDim[Byte](8192), 8192) socket.receive(packet) packet }.foreach { packet => log("Accept Client", "=>", packet.getSocketAddress) new Thread { override def run(): Unit = acceptedClient(socket, packet) }.start() } } } private def acceptedClient(socket: DatagramSocket, packet: DatagramPacket): Unit = { val word = new String(packet.getData, packet.getOffset, packet.getLength, StandardCharsets.UTF_8) val replyWord = s"You Say => $word" val replyWordBinary = replyWord.getBytes(StandardCharsets.UTF_8) packet.setData(replyWordBinary, 0, replyWordBinary.size) socket.send(packet) } } object UdpClient { def main(args: Array[String]): Unit = { val address = new InetSocketAddress(50000) for (socket <- new DatagramSocket) { val word = "Hello, Simple UDP Client!!" val wordBinary = word.getBytes(StandardCharsets.UTF_8) val buffer = Array.ofDim[Byte](8192) System.arraycopy(wordBinary, 0, buffer, 0, wordBinary.size) val packet = new DatagramPacket(buffer, 0, wordBinary.size, address) socket.send(packet) packet.setLength(8192) socket.receive(packet) println(new String(packet.getData, packet.getOffset, packet.getLength, StandardCharsets.UTF_8)) } } }