2009-08-03 7 views
22

私はClojure(言語を学ぶためのサンプルプロジェクトとして)に単純な多重化サーバーを書いていますが、私はこれをWeb上で手助けするためのリソースを見つけるのに非常に苦労しています。clojureで多重化サーバを作成していますか?

誰にもClojure のソケットプログラミングの基礎を指すリソースがありますが、そのようなサーバーを作成する最善の方法はありますか?

答えて

31

clojure.contrib.server-socketはあなたの友人です。それが動作することを確認するために

(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::シンプルなエコーサーバーを作成するので、同じようcreate-serverを使用clojure.contrib.server-socketが上に新しいスレッドを作成するため

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

ところで、サーバは、あまりにもマルチスレッド化され新しい接続を受け入れる。

これがあなたのニーズを満たしていない場合、Java APIはあなたの友人です。 ClojureからのJavaクラスへの完全なアクセス権があるので、メタルに落とす必要がある場合は、Javaソケットを使用することができます。私はあなたの背景については何も知らないが、以前にJavaソケットを使用していなかったと仮定すると、Sunはチュートリアルを持っている。http://java.sun.com/docs/books/tutorial/networking/sockets/

+1

美しい!ありがとう:) – horseyguy

+0

ありがとう!私はここであなたのコードを使って簡単なleiningenプロジェクトを作成しました:https://github.com/cymen/clojure-socket-echo – Cymen

+2

サーバーソケットは、clojure.contribの分割後には、clojars内に存在するようになりました。 https://clojars.org/server-socketはClojure> 1.2のための場所です。 –

1

clojure.contribを調べて、ソケットを操作するためのライブラリがあるかどうかを確認してください。存在しない場合は、ClojureのJava interop機能を使用してJavaクラスを使用して独自のコードを作成します。

10

これを実証するMireという小さなマルチプレイヤーテキストアドベンチャーゲームを書いた。それはかなり簡単です。

0

私はかなり簡単になるclj-socketsというライブラリを書いています。 READMEから:

(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があります。がんばろう!

関連する問題