Racket Echo Server /客户端挂起

时间:2017-12-06 04:41:50

标签: sockets networking client racket

我试图在Racket中创建一个简单的echo服务器和客户端。

这是服务器:

(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客户端代码中缺少什么?

1 个答案:

答案 0 :(得分:2)

这里有两个问题:

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

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

  3. 将您的客户端代码转换为:

    (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"