Networking 为什么';Racket上的网络服务器是否多次接收数据?
我正在尝试在Racket上创建一个网络服务器,它接收数据并对接收到的数据进行处理 我遇到的问题是,只有当客户端重新运行时,服务器才会从客户端接收到一些内容(单击run按钮)。我真正想要做的是能够在客户机控制台中输入(例如)(写入“test”out)我想要的次数,让服务器接收它并在服务器文件上的函数中处理数据 这是我最近一次尝试让它发挥作用。我正在使用echo服务器代码。但还是没有运气Networking 为什么';Racket上的网络服务器是否多次接收数据?,networking,functional-programming,lisp,racket,Networking,Functional Programming,Lisp,Racket,我正在尝试在Racket上创建一个网络服务器,它接收数据并对接收到的数据进行处理 我遇到的问题是,只有当客户端重新运行时,服务器才会从客户端接收到一些内容(单击run按钮)。我真正想要做的是能够在客户机控制台中输入(例如)(写入“test”out)我想要的次数,让服务器接收它并在服务器文件上的函数中处理数据 这是我最近一次尝试让它发挥作用。我正在使用echo服务器代码。但还是没有运气 (define listener (tcp-listen 3961)) (define (echo-serve
(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攻击。有关如何避免某些问题的信息,请查看(在racket文档中提供)。Brilliant!非常感谢你!