Split out tcp-client.rkt and tcp-echo-server.rkt

This commit is contained in:
Tony Garnock-Jones 2021-06-10 13:35:26 +02:00
parent 11eb0bcd6f
commit 2f4525b031
3 changed files with 60 additions and 52 deletions

View File

@ -0,0 +1,37 @@
#lang syndicate
;;; SPDX-License-Identifier: LGPL-3.0-or-later
;;; SPDX-FileCopyrightText: Copyright © 2021 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
(module+ main
(require racket/cmdline)
(require (only-in racket/port read-line-evt))
(require syndicate/drivers/tcp)
(require syndicate/drivers/racket-event)
(define host "127.0.0.1")
(define port 5999)
(command-line #:once-each
[("--host" "-H") hostname "Set hostname to connect to"
(set! host hostname)]
[("--port" "-p") port-number "Set port number to connect to"
(set! port (string->number port-number))])
(actor-system/dataspace (ds)
(spawn-racket-event-driver ds)
(spawn-tcp-driver ds)
(spawn
(establish-connection
ds (TcpOutbound host port)
#:on-connected (lambda (peer)
(at ds
(when (message (RacketEvent (read-line-evt (current-input-port)) $vs))
(match (car vs)
[(? eof-object?)
(log-info "EOF on stdin.")
(stop-current-facet)]
[line
(send-data peer (string-append line "\n"))]))))
#:on-rejected (lambda (message) (stop-current-facet (log-error "~a" message)))
#:on-disconnected (lambda () (stop-current-facet (log-info "Disconnected")))
#:on-data display))))

View File

@ -0,0 +1,23 @@
#lang syndicate
;;; SPDX-License-Identifier: LGPL-3.0-or-later
;;; SPDX-FileCopyrightText: Copyright © 2021 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
(module+ main
(require racket/cmdline)
(require syndicate/drivers/tcp)
(define host "0.0.0.0")
(define port 5999)
(command-line #:once-each
[("--host" "-H") hostname "Set hostname to listen on"
(set! host hostname)]
[("--port" "-p") port-number "Set port number to listen on"
(set! port (string->number port-number))])
(actor-system/dataspace (ds)
(spawn-tcp-driver ds)
(spawn
(at ds
(during/spawn (Connection $conn (TcpInbound host port))
(accept-connection conn #:on-data (lambda (data) (send-data conn data))))))))

View File

@ -159,55 +159,3 @@
(define (send-data conn data)
(send! conn (Socket (if (bytes? data) data (string->bytes/utf-8 data)))))
(module+ main
(require syndicate/drivers/timer)
(require racket/cmdline)
(define (run-echo-server ds host port)
(spawn
(at ds
(during/spawn (Connection $conn (TcpInbound host port))
(accept-connection conn #:on-data (match-lambda
[#"bye\n"
(send-data conn #"Bye then!\n")
(stop-current-facet)]
[data (send-data conn data)]))))))
(define (run-echo-client ds host port)
(spawn
(define-field sink #f)
(define-field counter 0)
(begin/dataflow
(when (sink)
(send! (sink) (Socket (string->bytes/utf-8 (format "~a\n" (counter)))))))
(establish-connection
ds (TcpOutbound host port)
#:on-connected (lambda (peer) (sink peer))
#:on-rejected (lambda (reason) (log-error "Connection failed: ~v" reason))
#:on-disconnected (lambda () (log-info "Disconnected"))
#:on-data (lambda (data)
(log-info "Got: ~v" data)
(counter (+ (counter) 1))))))
(define host #f)
(define port 5999)
(define mode 'server)
(command-line #:once-each
[("--host" "-H") hostname "Set host/interface to connect to/listen on"
(set! host hostname)]
[("--port" "-p") port-number "Set port number to connect to/listen on"
(set! port (string->number port-number))]
#:once-any
["--server" "Server mode"
(set! mode 'server)]
["--client" "Client mode"
(set! mode 'client)])
(actor-system/dataspace (ds)
(spawn-timer-driver ds)
(spawn-tcp-driver ds)
(match mode
['server (run-echo-server ds (or host "0.0.0.0") port)]
['client (run-echo-client ds (or host "127.0.0.1") port)])))