一、概述
本文是简单的clojure下Socket Server编程,所谓的简单是:收发都是string,可以通过函数启动和关闭Server。
所用的库为:aleph,项目地址:https://github.com/clj-commons/aleph
如果想自定制协议,可以查看项目中关于自定协议部分,本文不再冗述。project依赖
[aleph "0.5.0-rc2"]
最新版本号请在项目中自查。
二、引用
(:require
[manifold.stream :as s]
[aleph.tcp :as tcp])
第一个是stream封装,第二个是tcp封装
三、请求处理回调函数
(defn handle-in [instream]
(str "开始处理收到的内容,收到内容是:" (slurp instream)))
请求处理(handler)所回调函数就是个示例,其中slurp是从流中读取内容并返回内容的字符串,然后用str函数拼接了一下作为返回值。当server收到信息后,比如收到是Hello,服务器回应为:
开始处理收到的内容,收到内容是:Hello
四、请求处理函数
请求处理更加简单:多个客户端是多个流,对每个流用map,然后回调三中的函数就行。
map是clojure的,不能应用于流,所以这里用s/map
(defn echo-handler [s info]
(s/connect (s/map handle-in s) s))
五、开启服务器函数
开启服务用tcp/start-server即可,后面跟请求处理函数名,最后是端口号(例子中是10001)。
(tcp/start-server echo-handler {:port 10001})
上面的内容再官方网站都有介绍,本文的改进如下:
直接写这个函数会造成启动就运行服务器,repl状态下控制服务器启停不易,所以需要一个引用,初始值为空,然后将start-server打包,同理(.close server)就能关闭服务器,需要把server再设置为nil:
(def server (ref nil))
(defn start-server
"开启服务器"
[port]
(dosync (ref-set server (tcp/start-server echo-handler {:port port}))))
(defn close-server
"关闭服务器"
[]
(do (.close @server)
(dosync (ref-set server nil))))
六:样例代码
(ns socket-test.core
(:require
[manifold.stream :as s]
[aleph.tcp :as tcp]))
(def server (ref nil))
(defn handle-in [instream]
(str "开始处理收到的内容,收到内容是:" (slurp instream)))
(defn echo-handler [s msg]
(s/connect (s/map handle-in s) s))
(defn start-server
"开启服务器"
[port]
(dosync (ref-set server (tcp/start-server echo-handler {:port port}))))
(defn close-server
"关闭服务器"
[]
(do (.close @server)
(dosync (ref-set server nil))))
标签:socket,tcp,server,port,start,服务器,clojure,defn
From: https://www.cnblogs.com/solarup/p/16801737.html