ngo, I was about doing this kind of client/server thing some days ago, however now you are into it I would like to learn then. I am not quite clear why you have this: (.start (new Thread (fn [] (create-server 8080 chat-loop))))
My concern is on Thread, create-server function has a Thread inside create-server-aux function. Regards, Emeka On Fri, Oct 2, 2009 at 3:13 AM, ngocdaothanh <ngocdaoth...@gmail.com> wrote: > > > I'm not sure TCP/IP has a native facility for that. > > I'm afraid John's statement is correct: > > http://www.velocityreviews.com/forums/t125620-client-socket-disconnection-event-not-received-on-server-socket-java-nio.html > and trying to read and write until something wrong happens as > demonstrated in Roger's code is the only way to check for > disconnection. > > Below is my new code. Sorry it is rather long. > > (import '[java.io BufferedReader InputStreamReader > OutputStreamWriter]) > (use 'clojure.contrib.server-socket) > > (def clients (ref [])) ; Each client is an *out* > > (defn on-msg [from msg] > (println msg) > (doall > (map > (fn [client] > (if-not (= from client) > (binding [*out* client] > (println msg) > (flush)))) > @clients))) > > (defn on-disconnect [client] > (dosync > (alter clients > (fn [clients] > (remove (fn [c] (= c client)) clients)))) > (on-msg client "A client has disconnected")) > > (defn on-connect [client] > (dosync (alter clients conj client)) > (on-msg client "A client has connected")) > > (defn chat-loop [is os] > (let [client (OutputStreamWriter. os)] > (on-connect client) > (binding [*in* (BufferedReader. (InputStreamReader. is))] > (loop [] > (let [msg (read-line)] ; msg is nil when the client > disconnects > (if (nil? msg) > (on-disconnect client) > (do > (on-msg client msg) > (recur)))))))) > > (.start (new Thread (fn [] (create-server 8080 chat-loop)))) > > > On Oct 2, 5:20 am, John Harrop <jharrop...@gmail.com> wrote: > > On Thu, Oct 1, 2009 at 4:02 PM, Roger Gilliar <ro...@gilliar.de> wrote: > > > Am 01.10.2009 um 21:28 schrieb ngocdaothanh: > > > > Roger, your code is not event based. > > > What do you mean by not event based ? > > > > He means he wants automatic notification if a connection is dropped. > > > > I'm not sure TCP/IP has a native facility for that. > > > > What most chat type programs, multiplayer games, and suchlike do is send > a > > periodic ping from server to each connected client, which as part of the > > chat protocol the client is supposed to acknowledge. If a client stops > > responding for more than a few ping-intervals, it's assumed to have > > disconnected or otherwise become unreachable. > > > > This method has the advantage of being entirely under the control of the > > application layer, and the further advantage of also working with UDP > (which > > is crucial in the "multiplayer games" case at least). > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en -~----------~----~----~----~------~----~------~--~---