首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的网络服务器不能不止一次地接收数据呢?

为什么我的网络服务器不能不止一次地接收数据呢?
EN

Stack Overflow用户
提问于 2017-01-18 19:35:56
回答 1查看 262关注 0票数 1

我试图在Racket上创建一个网络服务器,它接收数据,并对接收到的数据做一些事情。

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

这是我试着让它工作的最新尝试。我用的是回送服务器代码。但还是没有运气。

代码语言:javascript
复制
(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)

客户端:

代码语言:javascript
复制
(define-values (in out)
  (tcp-connect "localhost" 3961))

(define sendtoserver
      (lambda ()
        (write "test" out)
        (flush-output out)))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-18 21:56:28

你离我很近。它只打印"test“一次的原因是因为您在读取输入端口一次之后实际上关闭了它。这意味着不能从服务器发送更多的信息。

如果您在繁忙的循环中这样做,也就是:

代码语言:javascript
复制
(let loop ()
  (print (read in))
  (loop))

你就能读到很多东西了。为您提供以下服务器代码。

代码语言:javascript
复制
#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)

当然,如果这样做,服务器线程永远不会终止。因此,您可能需要检查流的末尾。类似于:

代码语言:javascript
复制
#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攻击开放。有关如何避免其中一些问题的信息,请查看更多:用球拍进行系统编程 (在球拍文档中提供)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41727972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档