我试图在Racket上创建一个网络服务器,它接收数据,并对接收到的数据做一些事情。
我遇到的问题是,如果客户机重新运行(单击run按钮),服务器只能从客户端接收到一些东西。我真正想做的是能够在客户机控制台中输入(例如)(写"test“out)多少次,并让服务器接收它并在服务器文件上的函数中处理数据。
这是我试着让它工作的最新尝试。我用的是回送服务器代码。但还是没有运气。
(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)))发布于 2017-01-18 21:56:28
你离我很近。它只打印"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攻击开放。有关如何避免其中一些问题的信息,请查看更多:用球拍进行系统编程 (在球拍文档中提供)。
https://stackoverflow.com/questions/41727972
复制相似问题