我试图在Racket上创建一个网络服务器,它接收数据并对接收到的数据进行处理。
我遇到的问题是,只有当客户端重新运行时(单击run按钮),服务器才会从客户端接收某些内容我真正想做的是能够在客户机控制台中键入(例如)(写出“test”输出)任意次数,并让服务器接收它并在服务器文件的函数中处理数据。
这是我最近的一次尝试我正在使用echo服务器代码但还是没有运气。
(define listener (tcp-listen 3961))
(define (echo-server)
(define-values (in out) (tcp-accept listener))
(thread (lambda ()
(print (read in))
(close-output-port out)))
(echo-server))
(echo-server)
客户:
(define-values (in out)
(tcp-connect "localhost" 3961))
(define sendtoserver
(lambda ()
(write "test" out)
(flush-output out)))
最佳答案
你很接近它只打印一次“test”的原因是,在读取一次输入端口后,您实际上关闭了它这意味着无法从服务器发送更多信息。
如果你在一个繁忙的循环中这样做,又称:
(let loop ()
(print (read in))
(loop))
你会读到很多东西提供以下服务器代码。
#lang racket
(define listener (tcp-listen 3961))
(define (echo-server)
(define-values (in out) (tcp-accept listener))
(thread (lambda ()
(let loop ()
(print (read in))
(loop))))
(echo-server))
(echo-server)
当然,如果这样做,服务器线程将永远不会终止。所以你可能想看看这条河的尽头。类似于:
#lang racket
(define listener (tcp-listen 3961))
(define (echo-server)
(define-values (in out) (tcp-accept listener))
(thread (lambda ()
(let loop ()
(define val (read in))
(print val)
(unless (eof-object? val)
(loop)))))
(echo-server))
(echo-server)
这确实假设您的客户机最终将断开连接而且,这不是一个健壮的服务器,因为这仍然会让它面临许多DNS攻击有关如何避免其中一些错误的信息,请查看More: Systems Programming With Racket(在racket文档中提供)。
关于networking - 为什么我在Racket上的网络服务器不能多次接收数据?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41727972/