<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
        寫著玩的,不使用任何網(wǎng)絡(luò)框架從頭構(gòu)建的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      }))


    主站蜘蛛池模板: 亚洲毛片av日韩av无码| 亚洲伦理一区二区| 免费在线黄色电影| 亚洲自偷自拍另类12p| 女人张开腿等男人桶免费视频| 国内精品免费在线观看 | 成人午夜18免费看| 激情小说亚洲色图| 亚洲AV日韩精品久久久久久久 | 亚洲AV无码一区二区大桥未久| 日韩电影免费观看| 亚洲av无码专区青青草原| 国产成人精品久久亚洲高清不卡 | 亚洲av无码成人精品国产| 亚洲日产韩国一二三四区| 亚洲人成免费电影| 一级做a爰片久久毛片免费看| 亚洲精品国产综合久久一线| 鲁丝片一区二区三区免费| 亚洲人成色777777老人头| 国产V亚洲V天堂无码久久久| 日韩毛片无码永久免费看| 4虎1515hh永久免费| 丝袜捆绑调教视频免费区| 亚洲精品无码中文久久字幕| 久久国产亚洲精品无码| 老司机亚洲精品影视www| 毛片a级毛片免费播放下载| 国产成人精品无码免费看| 日本在线观看免费高清| 亚洲人成网站999久久久综合| 狠狠久久永久免费观看| 久热免费在线视频| 一级毛片在线免费播放| 在线精品自拍亚洲第一区| 在线综合亚洲欧洲综合网站| 国产V亚洲V天堂无码久久久| 国产自偷亚洲精品页65页| 免费h成人黄漫画嘿咻破解版| 国产综合免费精品久久久| 美女被爆羞羞网站免费|