为什么我的Racket上的网络服务器不会多次接收数据?

时间:2017-01-18 19:35:56

标签: networking functional-programming lisp racket

我试图在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)))

1 个答案:

答案 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(在球拍文档中提供)。