在clojure中写一个多路复用服务器?

hor*_*guy 22 sockets clojure

我想在Clojure中编写一个简单的多路复用服务器(作为学习语言的示例项目),但我很难找到资源来帮助我在网上.

有没有人有任何资源可以指出Clojure中的套接字编程的基础知识和编写这样的服务器的最佳方法?

ala*_*ode 31

clojure.contrib.server-socket是你的朋友.create-server像这样使用来创建一个简单的echo服务器:

(import '[java.io BufferedReader InputStreamReader OutputStreamWriter])
(use 'clojure.contrib.server-socket)
(defn echo-server []
  (letfn [(echo [in out]
                    (binding [*in* (BufferedReader. (InputStreamReader. in))
                              *out* (OutputStreamWriter. out)]
                      (loop []
                        (let [input (read-line)]
                          (print input)
                          (flush))
                        (recur))))]
    (create-server 8080 echo)))

(def my-server (echo-server))
Run Code Online (Sandbox Code Playgroud)

现在telnet以确保它的工作原理:

$ telnet localhost 8080
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
hello
hello  // this is the echoed line, woohoo!
Run Code Online (Sandbox Code Playgroud)

顺便说一句,服务器也是多线程的,因为clojure.contrib.server-socket在接受新连接时创建一个新线程.

如果这不符合您的需求,那么Java API就是您的朋友.由于您可以完全访问Clojure中的Java类,因此如果需要了解Java金属,则可以使用Java套接字.我对你的背景一无所知,但假设你之前没有使用过Java套接字,Sun有一个教程:http://java.sun.com/docs/books/tutorial/networking/sockets/

  • 在clojure.contrib解体后,服务器套接字现在存在于clojars中.https://clojars.org/server-socket是Clojure> 1.2的地方. (2认同)

小智 10

我写了一个名为Mire的小型多人文字冒险游戏来演示这个.这很简单.