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
-~----------~----~----~----~------~----~------~--~---

Reply via email to