<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    莊周夢蝶

    生活、程序、未來
       :: 首頁 ::  ::  :: 聚合  :: 管理

    A 77 lines echo server in clojure

    Posted on 2011-01-15 22:56 dennis 閱讀(1895) 評論(0)  編輯  收藏 所屬分類: Clojure
        寫著玩的,不使用任何網絡框架從頭構建的echo server,總共77行。
     1 ;;Author:dennis (killme2008@gmail.com)
     2 (ns webee.network
     3    (:import (java.nio.channels Selector SocketChannel ServerSocketChannel SelectionKey)
     4             (java.net InetSocketAddress)
     5             (java.nio ByteBuffer)
     6             (java.io IOException)))
     7 
     8 (declare reactor process-keys accept-channel read-channel)
     9 
    10 (defn bind [^InetSocketAddress addr fcol]
    11   (let [selector (Selector/open)
    12         ssc      (ServerSocketChannel/open)
    13         ag  (agent selector)]
    14     (do
    15       (.configureBlocking ssc false)
    16       (.. ssc (socket) (bind addr 1000))
    17       (.register ssc selector SelectionKey/OP_ACCEPT)
    18       (send-off ag reactor fcol)
    19       ag)))
    20 
    21 (defn- reactor [^Selector selector fcol]
    22   (let [sel (. selector select 1000)]
    23     (if (> sel 0)
    24       (let [sks (. selector selectedKeys)]
    25         (do 
    26           (dorun (map (partial process-keys selector fcol) sks))
    27           (.clear sks))))
    28     (recur selector fcol)))
    29   
    30 (defn- process-keys [^Selector selector ^SelectionKey fcol sk]
    31   (try
    32     (cond 
    33       (.isAcceptable sk) (accept-channel sk  selector fcol)
    34       (.isReadable sk) (read-channel sk selector fcol)    
    35     )
    36     (catch Throwable e (.printStackTrace e))))
    37 
    38 (defn- accept-channel [^SelectionKey sk ^Selector selector fcol]
    39    (let [^ServerSocketChannel ssc (. sk channel)
    40          ^SocketChannel sc (. ssc accept)
    41          created-fn (:created fcol)]
    42      (do 
    43        (.configureBlocking sc false
    44        (.register sc selector SelectionKey/OP_READ)
    45        (if created-fn
    46          (created-fn sc)))))
    47 
    48 (defn- close-channel [^SelectionKey sk ^SocketChannel sc fcol]
    49   (let [closed-fn (:closed fcol)]
    50     (do 
    51        (.close sc)
    52        (.cancel sk)
    53        (if closed-fn 
    54          (closed-fn sc)))))
    55      
    56 (defn-  read-channel [^SelectionKey sk ^Selector selector fcol]
    57    (let [^SocketChannel sc (. sk channel)
    58          ^ByteBuffer buf (ByteBuffer/allocate 4096)
    59          read-fn (:read fcol)]
    60      (try
    61        (let [n (.read sc buf)]
    62          (if (< n 0)
    63              (close-channel sk sc fcol)
    64              (do (.flip buf)
    65                  (if read-fn
    66                    (read-fn sc buf)))))
    67        (catch IOException e
    68          (close-channel sk sc fcol)))))
    69 
    70 ;;Bind a tcp server to localhost at port 8080,you can telnet it.
    71 (def server
    72   (bind 
    73     (new InetSocketAddress 8080)
    74     {:read #(.write %1 %2)
    75      :created #(println "Accepted from" (.. % (socket) (getRemoteSocketAddress)))
    76      :closed  #(println "Disconnected from" (.. % (socket) (getRemoteSocketAddress)))
    77      }))


    主站蜘蛛池模板: 国产l精品国产亚洲区在线观看| 国产va精品免费观看| 国产福利免费视频| 日韩精品免费一线在线观看| 亚洲AV无码专区亚洲AV桃| 亚洲久悠悠色悠在线播放| 亚洲高清一区二区三区| 国产精品亚洲自在线播放页码| 亚洲AV无码国产精品色| 亚洲精品亚洲人成在线播放| 亚洲一区二区久久| 亚洲熟妇无码AV| 日本系列1页亚洲系列| 四虎影视在线看免费观看| 国产区在线免费观看| 中文字幕成人免费高清在线视频| 福利免费在线观看| 日韩免费电影网站| 四虎1515hh永久久免费| 我要看免费的毛片| 免费又黄又爽又猛的毛片| 亚洲色图综合在线| 亚洲伊人tv综合网色| 亚洲一区二区三区四区视频| 亚洲男人天堂2018av| 在线91精品亚洲网站精品成人| 一级毛片免费在线| 久久久久久影院久久久久免费精品国产小说| 99久久免费精品视频| 欧美a级成人网站免费| 免费大香伊蕉在人线国产| 国产亚洲视频在线播放| 亚洲免费观看视频| 亚洲国产视频一区| 国产亚洲精品美女久久久久久下载| 男女猛烈激情xx00免费视频| 免费福利在线视频| 免费可以在线看A∨网站| 亚洲国产精品无码久久青草| 亚洲va久久久噜噜噜久久 | 18禁止观看免费私人影院|