Ngo, Honestly speaking I don't know. How far have you gone?
Regards, Emeka On Sat, Oct 3, 2009 at 3:21 PM, ngocdaothanh <ngocdaoth...@gmail.com> wrote: > > Emeka, good catch. It's just my mistake. > > Another thing is I think there may be exception raised when on-msg > sends message to a closed socket. How would you solve this? > > > On Oct 3, 7:35 pm, Emeka <emekami...@gmail.com> wrote: > > 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-disconnec. > .. > > > 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 -~----------~----~----~----~------~----~------~--~---