59 lines
1.7 KiB
Racket
59 lines
1.7 KiB
Racket
|
#lang racket
|
||
|
|
||
|
;; Both `server' and `accept-and-handle' change
|
||
|
;; to use a custodian.
|
||
|
;; To start server
|
||
|
;; (define stop (serve 8080))
|
||
|
;; use your web browser to connect localhost:8080 greeted with "hello world"
|
||
|
;; (stop) to close the server
|
||
|
|
||
|
(define (serve port-no)
|
||
|
(define main-cust (make-custodian))
|
||
|
(parameterize ([current-custodian main-cust])
|
||
|
(define listener (tcp-listen port-no 5 #t))
|
||
|
(define (loop)
|
||
|
(accept-and-handle listener)
|
||
|
(loop))
|
||
|
(thread loop))
|
||
|
(lambda ()
|
||
|
(displayln "\nGoodbye, shutting down all services\n")
|
||
|
(custodian-shutdown-all main-cust)))
|
||
|
|
||
|
(define (accept-and-handle listener)
|
||
|
(define cust (make-custodian))
|
||
|
(parameterize ([current-custodian cust])
|
||
|
(define-values (in out) (tcp-accept listener))
|
||
|
(thread (lambda ()
|
||
|
(handle in out) ;; this handles connection with that specific client
|
||
|
(close-input-port in)
|
||
|
(close-output-port out))))
|
||
|
;; Watcher thread:
|
||
|
(thread (lambda ()
|
||
|
(sleep 120)
|
||
|
(custodian-shutdown-all cust))))
|
||
|
|
||
|
(define (handle in out)
|
||
|
; (server-loop in out)
|
||
|
(sleep 5) ;; wait 5 seconds to guarantee client has already send message
|
||
|
(define echo (read-line in)) ;; bind message to echo
|
||
|
(displayln (string-append echo "\n"))
|
||
|
; echo back the message, appending echo
|
||
|
; could regex match the input to extract the name
|
||
|
(writeln "Admin: Hello there" out) ;; append "echo " to echo and send back
|
||
|
(flush-output out)
|
||
|
)
|
||
|
|
||
|
(define input-prompt "Hermes: ")
|
||
|
|
||
|
(define (server-loop in out)
|
||
|
(define echo (read-line in))
|
||
|
(displayln echo)
|
||
|
(display ">>> ")
|
||
|
|
||
|
(define input (read))
|
||
|
(writeln (string-append "Admin: " input) out)
|
||
|
(flush-output out)
|
||
|
; (sleep 10)
|
||
|
(server-loop in out))
|
||
|
|