我试图在Racket上创建一个接收数据的网络服务器,并使用收到的数据 。
我遇到的问题是,如果重新运行客户端(单击运行按钮),服务器只会从客户端收到一些内容。我真正想做的是能够在客户端控制台中输入(例如)(写"测试"输出)我想要的次数以及服务器接收它并处理数据服务器文件上的函数。
这是我尝试使其发挥作用的最新尝试。我正在使用echo-server代码。但仍然没有运气。
(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)))
答案 0 :(得分:2)
你关闭了。之所以只打印出来" test"曾经是因为您在读取输入端口之后实际关闭了输入端口。这意味着无法从服务器发送更多信息。
如果你在繁忙的循环中做了这个,又名:
(let loop ()
(print (read in))
(loop))
您将能够阅读多个内容。给你以下SERVER代码。
#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(在球拍文档中提供)。