aboutsummaryrefslogtreecommitdiff
path: root/src/clojure/contrib/server_socket.clj
diff options
context:
space:
mode:
authorscgilardi <scgilardi@gmail.com>2009-01-26 04:19:34 +0000
committerscgilardi <scgilardi@gmail.com>2009-01-26 04:19:34 +0000
commit336e64802cb60649c72271332f7bc14ece06944d (patch)
tree51577c198ad6552f3b1c33cf3f1b193c0499a9e9 /src/clojure/contrib/server_socket.clj
parent522ee2fead85d24907cfc0247568658001b8c807 (diff)
Fixed issue 5: updated code from Craig McDaniel
Diffstat (limited to 'src/clojure/contrib/server_socket.clj')
-rw-r--r--src/clojure/contrib/server_socket.clj34
1 files changed, 23 insertions, 11 deletions
diff --git a/src/clojure/contrib/server_socket.clj b/src/clojure/contrib/server_socket.clj
index 26426d7e..4c9f6d65 100644
--- a/src/clojure/contrib/server_socket.clj
+++ b/src/clojure/contrib/server_socket.clj
@@ -9,7 +9,7 @@
;; Server socket library - includes REPL on socket
(ns clojure.contrib.server-socket
- (:import (java.net ServerSocket Socket SocketException)
+ (:import (java.net InetAddress ServerSocket Socket SocketException)
(java.io InputStreamReader OutputStream OutputStreamWriter PrintWriter)
(clojure.lang LineNumberingPushbackReader))
(:use clojure.main))
@@ -37,22 +37,30 @@
(dosync (commute connections disj s))))))
(defstruct server-def :server-socket :connections)
-
-(defn create-server
- "Creates a server socket on port. Upon accept, a new thread is
- created which calls:
- (fun input-stream output-stream)"
- [port fun]
- (let [ss (ServerSocket. port)
- connections (ref #{})]
+(defn- create-server-aux [fun #^ServerSocket ss]
+ (let [connections (ref #{})]
(on-thread #(when-not (.isClosed ss)
(try
(accept-fn (.accept ss) connections fun)
(catch SocketException e))
(recur)))
(struct-map server-def :server-socket ss :connections connections)))
+
+(defn create-server
+ "Creates a server socket on port. Upon accept, a new thread is
+ created which calls:
+
+ (fun input-stream output-stream)
+ Optional arguments support specifying a listen backlog and binding
+ to a specific endpoint."
+ ([port fun backlog #^InetAddress bind-addr]
+ (create-server-aux fun (ServerSocket. port backlog bind-addr)))
+ ([port fun backlog]
+ (create-server-aux fun (ServerSocket. port backlog)))
+ ([port fun]
+ (create-server-aux fun (ServerSocket. port))))
(defn close-server [server]
(doseq [s @(:connections server)]
@@ -75,5 +83,9 @@
(defn create-repl-server
"create a repl on a socket"
- [port]
- (create-server port socket-repl))
+ ([port backlog #^InetAddress bind-addr]
+ (create-server port socket-repl backlog bind-addr))
+ ([port backlog]
+ (create-server port socket-repl backlog))
+ ([port]
+ (create-server port socket-repl)))