(use tcp6 srfi-18 matchable) (define (chat-message text port) (let ((msg (list 'event 'chat-message text))) (write msg port))) (define (input-loop out) (let loop () (print "input-loop-begin") (let ((line (read-line))) (when (not (eq? line #!eof)) (chat-message line out) (thread-sleep! 1) (thread-yield!) (print "input-loop-end") (loop)))) (print "input-loop-terminate")) (define +hostname+ "localhost") (define +port+ 4242) (define (dispatch-message msg) (match msg (`(event . ,evt) (print "evt:" evt) (flush-output)))) (define (handle-message in) (let ((msg (read in))) (case msg ((#!eof) #f) (else (dispatch-message msg) #t)))) (define (client-loop in) (let handle-next-message () (print "client-loop-begin") (when (and (not (port-closed? in)) (handle-message in)) (thread-sleep! 1) (thread-yield!) (print "client-loop-end") (handle-next-message))) (print "client-loop-terminate")) (define (start-client) (let-values (((in out) (tcp-connect +hostname+ +port+))) (let ((client (thread-start! (lambda () (client-loop in)))) (input (thread-start! (lambda () (input-loop out))))) (thread-join! client) (thread-join! input)))) (start-client) ;; ➜ examples git:(master) ✗ csi -s chat-client.scm client-loop-begin input-loop-begin asdfabcd evt:(chat-message (asdfabcd)) input-loop-end input-loop-begin 1234 client-loop-end client-loop-begin evt:(chat-message (1234)) input-loop-end input-loop-begin input-loop-terminate client-loop-end client-loop-begin ^C *** user interrupt ***