Networking 为什么';Racket上的网络服务器是否多次接收数据?

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

我正在尝试在Racket上创建一个网络服务器,它接收数据并对接收到的数据进行处理

我遇到的问题是,只有当客户端重新运行时,服务器才会从客户端接收到一些内容(单击run按钮)。我真正想要做的是能够在客户机控制台中输入(例如)(写入“test”out)我想要的次数,让服务器接收它并在服务器文件上的函数中处理数据

这是我最近一次尝试让它发挥作用。我正在使用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攻击。有关如何避免某些问题的信息,请查看(在racket文档中提供)。

Brilliant!非常感谢你!