首页 > 编程语言 >简单的clojure下socket server编程

简单的clojure下socket server编程

时间:2022-10-18 10:35:34浏览次数:75  
标签:socket tcp server port start 服务器 clojure defn

一、概述

本文是简单的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

相关文章