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

时间:2009-08-03 16:42:42

标签: clojure sockets

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

有没有人能够指出Clojure中套接字编程的基础知识 写这样一个服务器的最佳方法是什么?

4 个答案:

答案 0 :(得分: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))

现在telnet以确保它有效:

$ telnet localhost 8080
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
hello
hello  // this is the echoed line, woohoo!

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

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

答案 1 :(得分:10)

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

答案 2 :(得分:1)

查看clojure.contrib以查看是否有任何用于操作套接字的库。如果没有,那么你就可以通过Clojure的Java互操作工具使用Java类来编写自己的。

答案 3 :(得分:0)

我写了一个名为clj-sockets的库,这很容易。来自自述文件:

(def server (listen (create-server 9871)))
; blocks until a connection is made
; in this case I'm doing "telnet localhost 9871" from the shell
=> #'clj-sockets.core/server

server
=> #<Socket Socket[addr=/0:0:0:0:0:0:0:1%0,port=57437,localport=9871]>

(read-line server)
; blocks until a line is sent (in this case through telnet)
=> "hello from telnet"

(write-line server "hello there, person using telnet!")
=> nil

(close server)
=> nil

它也可以帮助你connect to remote hosts。如果你想看看引擎盖,那就annotated source code。祝你好运!