(module tcp-repl racket/base (require mzlib/thread racket/tcp) (provide (prefix-out tcp-repl- run) (prefix-out tcp-repl- logger)) (define logger (make-logger 'tcp-repl (current-logger))) (define (run namespace port) (thread (lambda () (run-server port ; TCP-Port (make-connection-handler namespace) ; connection handler #f; timeout (lambda (tcp-port max-allow-wait reuse?) ; listen handler (log-message logger 'info (format "Listen on ~a:~a" "127.0.0.1" tcp-port) #t) (tcp-listen tcp-port max-allow-wait reuse? "127.0.0.1")) )))) (define (tcp-tostring port) (let-values ([(address-from port-from address-to port-to) (tcp-addresses port #t)]) (format "~a:~a -> ~a:~a" address-from port-from address-to port-to))) (define (make-connection-handler namespace) (lambda (ip op) (let/ec exit (log-message logger 'info (format "New Connection ~a" (tcp-tostring ip)) #t) (parameterize ([current-input-port ip] [current-output-port op] [current-error-port op] [current-namespace namespace]) (read-eval-print-loop)) (log-message logger 'info (format "End Connection ~a" (tcp-tostring ip)) #t) (close-output-port op)))) ) ; end module tcp-repl