我想在Clojure中编写一个简单的多路复用服务器(作为学习语言的示例项目),但我很难找到资源来帮助我在网上进行这项工作。
有没有人能够指出Clojure中套接字编程的基础知识 写这样一个服务器的最佳方法是什么?
答案 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。祝你好运!