Paste number 88567: clojure-nio-basic

Index of paste annotations: 1

Paste number 88567: clojure-nio-basic
Pasted by: ossareh
When:3 months, 4 weeks ago
Share:Tweet this! | http://paste.lisp.org/+1WC7
Channel:None
Paste contents:
Raw Source | XML | Display As
(ns sockets.connection
  (:import java.nio.channels.ServerSocketChannel)
  (:import java.nio.channels.Selector)
  (:import java.nio.channels.SelectionKey)
  (:import java.net.InetSocketAddress)
  (:import java.io.PrintWriter))


(defn- make-nio-server-socket
  "Creates server socket"
  []
  (ServerSocketChannel/open))

(defn make-nonblocking-nio-server-socket
  "Creates a non blocking socket"
  []
  (let [socket-channel (make-nio-server-socket)]
    (.configureBlocking socket-channel false)
    socket-channel))

(defn connect-socket!
  "connects the given socket to the host and port"
  [socket-channel host port]
  (.bind (.socket socket-channel) (InetSocketAddress. host port))
  socket-channel)

(defn close-socket!
  "disconnects the given socket"
  [socket-channel]
  (.close socket-channel))


;;  (loop [event-cnt (.select selector)
;;         selected-keys (.selectedKeys selector)]
;;    (println "found " event-cnt " events")
;;    (for [key selected-keys]
;;      (.remove selected-keys key))
;;    (recur (.select selector) (.selectedKeys selector))))

(defn handle-connection
  "output msg to connection"
  [key]
  (let [socket (.. key channel accept socket)
        out (PrintWriter. (.getOutputStream socket) true)]

    (.println out "k, thx, bye")
    (.close out)))

;; should probably be a thread
(defn recv
  "receives the given events for the socket"
  [socket-channel key-type]
  (let [selector (Selector/open)]

    (println "registering")
    (.register socket-channel selector key-type)
    
    (println "selecting")
    (loop [event-count (.select selector)
           event-keys (.selectedKeys selector)]

      (println (str "event count: " event-count))
      (println (str "length of key set: " (.size event-keys)))

      (doall (map println event-keys))
      (doall (map #(handle-connection %) event-keys))
      
      (println (str "length of key set: " (.size event-keys)))
      ;; recur
      (recur (.select selector) (.. selector selectedKeys) ))))

Annotations for this paste:

Annotation number 1: untitled
Pasted by: ossareh
When:3 months, 4 weeks ago
Share:Tweet this! | http://paste.lisp.org/+1WC7/1
Paste contents:
Raw Source | Display As
(ns sockets.connection
  (:import java.nio.channels.ServerSocketChannel)
  (:import java.nio.channels.Selector)
  (:import java.nio.channels.SelectionKey)
  (:import java.net.InetSocketAddress)
  (:import java.io.PrintWriter))


(defn- make-nio-server-socket
  "Creates server socket"
  []
  (ServerSocketChannel/open))

(defn make-nonblocking-nio-server-socket
  "Creates a non blocking socket"
  []
  (let [socket-channel (make-nio-server-socket)]
    (.configureBlocking socket-channel false)
    socket-channel))

(defn connect-socket!
  "connects the given socket to the host and port"
  [socket-channel host port]
  (.bind (.socket socket-channel) (InetSocketAddress. host port))
  socket-channel)

(defn close-socket!
  "disconnects the given socket"
  [socket-channel]
  (.close socket-channel))

(defn handle-connection
  "output msg to connection"
  [key]
  (let [socket (.. key channel accept socket)
        out (PrintWriter. (.getOutputStream socket) true)]

    (.println out "k, thx, bye")
    (.close out)))

;; should probably be a thread
(defn recv
  "receives the given events for the socket"
  [socket-channel key-type]
  (let [selector (Selector/open)]

    (println "registering")
    (.register socket-channel selector key-type)
    
    (println "selecting")
    (loop [event-count (.select selector)
           event-keys (.selectedKeys selector)]

      (println (str "event count: " event-count))
      (println (str "length of key set: " (.size event-keys)))

      (doall (map println event-keys))
      (doall (map #(handle-connection %) event-keys))
      
      (println (str "length of key set: " (.size event-keys)))
      ;; recur
      (recur (.select selector) (.. selector selectedKeys) ))))

Colorize as:
Show Line Numbers
Index of paste annotations: 1

Lisppaste pastes can be made by anyone at any time. Imagine a fearsomely comprehensive disclaimer of liability. Now fear, comprehensively.