(module echo mzscheme
  (define PORT 8888)
  (define DATA "Hello there sailor\n")
  (define n 10)

  (define (server)
    (thread client)
    (let-values ([(in out) (tcp-accept (tcp-listen PORT 5 #t))]
		 [(buffer) (make-string (string-length DATA))])
      (file-stream-buffer-mode out 'none)
      (let loop ([i (read-string! buffer in)]
		 [bytes 0])
	(if (not (eof-object? i))
	    (begin
	      (display buffer out)
	      (loop (read-string! buffer in)
		    (+ bytes (string-length buffer))))
	    (begin
	      (display "server processed ")
	      (display bytes)
	      (display " bytes\n"))))))

  (define (client)
    (let-values ([(in out) (tcp-connect "127.0.0.1" PORT)]
		 [(buffer) (make-string (string-length DATA))])
      (file-stream-buffer-mode out 'none)
      (let loop ([n n])
	(if (> n 0)
	    (begin
	      (display DATA out)
	      (let ([i (read-string! buffer in)])
		(begin
		  (if (equal? DATA buffer)
		      (loop (- n 1))
		      'error))))
	    (close-output-port out)))))

  (define (main args)
    (set! n
	  (if (= (vector-length args) 0)
	      1
	      (string->number (vector-ref  args 0))))
    (server))

  (main (current-command-line-arguments)))
