> 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