websocket-driver icon indicating copy to clipboard operation
websocket-driver copied to clipboard

Client side 'close-connection' doesn't trigger on-close of server side

Open nutora opened this issue 3 years ago • 2 comments

  • Server-side code
(ql:quickload '(:websocket-driver-server :clack))

(use-package :websocket-driver)

(defvar *echo-server*
  (lambda (env)
    (let ((ws (make-server env)))
      (on :message ws
          (lambda (message)
            (send ws message)))
      (on :close ws
          (lambda (&key code reason)
            (declare (ignore code reason)
                     (format t "...~a disconnected.~%" ws))))
      (lambda (responder)
        (declare (ignore responder))
        (start-connection ws)))))

;; Start Wookie server
(clack:clackup *echo-server* :port 5000)
  • Client-side

(defvar *client* (wsd:make-client "ws://localhost:5000/echo"))

(wsd:start-connection *client*)
(wsd:on :message *client*
        (lambda (message)
          (format t "~&Got: ~A~%" message)))
(wsd:send *client* "Hi")
(wsd:close-connection *client*) ;;this won't trigger sever-side's on :close

if connected the server with browser, when close the tab in browser or just close the browser, that call-back function will trigger, what have i missed in all of this ? please help, struggled in this for weeks

nutora avatar Oct 20 '21 02:10 nutora

Hi, I find that : (on :close ws (lambda (&key code reason) (declare (ignore code reason) (format t "...~a disconnected.~%" ws)))) should be: (on :close ws (lambda (&key code reason) (declare (ignore code reason)) (format t "...~a disconnected.~%" ws))) You miss ")" in declcare context. wish!

anranyicheng avatar Mar 20 '22 14:03 anranyicheng

And, if you want to close server client connection, you should design traffic protocol, for example [https://github.com/fukamachi/websocket-driver/issues/39]

anranyicheng avatar Mar 20 '22 15:03 anranyicheng