【问题标题】:Racket Echo Server/Client hangingRacket Echo 服务器/客户端挂起
【发布时间】:2018-05-19 21:33:38
【问题描述】:

我正在尝试在 Racket 中创建一个简单的回显服务器和客户端。

这是服务器:

(define (hello_listen port)
    (define listener (tcp-listen port))
    (define (loop)
        (define-values (in out) (tcp-accept listener))
        (thread (lambda ()
                (copy-port in out)
                (close-output-port out)))
        (loop))
    (loop))

这是客户端:

(define (hello_socket port)
    (define-values (in out) (tcp-connect "localhost" port))
    (write "hello socket world\n" out)
    (display (read in)))

客户端没有收到任何返回的文本,只是挂起读取。

然而,当我用 Python 编写一个简单的客户端时,行为很好:

>>> import socket
>>> s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
>>> s.connect(('localhost', 9999))
>>> s.send("hi")   
2
>>> s.recv(500)
'hi' 

我在 Racket 客户端代码中遗漏了什么?

【问题讨论】:

    标签: sockets networking client racket


    【解决方案1】:

    这里有两个问题:

    1. Racket 缓冲区中的 TCP 端口。因此,在您的球拍脚本中,您实际上并没有发送数据。解决此问题的最简单方法是使用flush-output,但这会导致您的第二个问题。

    2. 您的服务器使用copy-port,根据文档,在端口关闭之前不会完成。因此,您可以自己终止它,或者让客户端使用close-output-port 关闭它。

    这会将您的客户端代码变成:

    (define (hello_socket port)
      (define-values (in out) (tcp-connect "localhost" port))
      (write "hello socket world\n" out)
      (close-output-port out)
      (display (read in)))
    

    通过此更改运行您的客户端(在您的服务器处于活动状态的情况下)会导致预期的行为:

    > (thread (lambda () (hello_listen 1337)))
    > (hello_socket 1337)
    "hello socket world\n"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-10
      • 1970-01-01
      • 2015-06-21
      • 1970-01-01
      • 1970-01-01
      • 2017-09-13
      • 1970-01-01
      • 2023-02-22
      相关资源
      最近更新 更多