gpt4 book ai didi

sockets - Racket 回音服务器/客户端挂起

转载 作者:行者123 更新时间:2023-12-03 11:52:55 25 4
gpt4 key购买 nike

我正在尝试在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客户端代码中缺少什么?

最佳答案

这里有两个问题:

ract缓冲区中的

  • TCP端口。因此,在 Racket 脚本中,您实际上并没有发送数据。解决此问题的最简单方法是使用 flush-output ,但这会导致您的第二个问题。
  • 您的服务器使用 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)))

    通过此更改,运行客户端(服务器处于 Activity 状态)会导致预期的行为:
    > (thread (lambda () (hello_listen 1337)))
    > (hello_socket 1337)
    "hello socket world\n"

    关于sockets - Racket 回音服务器/客户端挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47666904/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com