Multithreading 检查输入端口上的数据是否可用

Multithreading 检查输入端口上的数据是否可用,multithreading,tcp,port,racket,polling,Multithreading,Tcp,Port,Racket,Polling,我在服务器和客户端之间有一个tcp连接,我正在寻找一种在服务器端轮询输入端口的方法。如果有任何可用的数据,应将其读取并放入列表中。我试着把它放在一个线程中,但是这个阻塞直到它可以读取一些东西,这不是我想要的。我希望线程“在后台”运行。我想知道这在球拍中是否可行 我有以下代码: (define in '()) (define out '()) (define data '()) (define listener (tcp-listen 8085)) (define (discover)

我在服务器和客户端之间有一个tcp连接,我正在寻找一种在服务器端轮询输入端口的方法。如果有任何可用的数据,应将其读取并放入列表中。我试着把它放在一个线程中,但是这个阻塞直到它可以读取一些东西,这不是我想要的。我希望线程“在后台”运行。我想知道这在球拍中是否可行

我有以下代码:

(define in '())
(define out '())
(define data '())
(define listener (tcp-listen 8085))

(define (discover)
    (define (loop)
        (if (tcp-accept-ready? listener)
            (begin (let-values (((pi po) (tcp-accept listener)))
                     (set! in pi)
                     (set! out po)
                     (thread (read-thread pi)))
                   (loop))
            'done))
  (loop))

(define (read-thread port)
    (let ((d (read port)))
        (set! data (cons d data)))
    (sleep 2)
    (read-thread port))

你真的想读取字节,还是球拍表达式?(因为如果是后者,在“等到你有一个完整的表达给我”和“但永远不要阻止”之间会有一些紧张。)

也许字节是可以的,而您之所以使用
read
,仅仅是因为您不知道
read bytes
?如果使用的是
读取字节
,则可以替换为在没有可读取字节时立即返回0的字节


然而,如果您真的想使用
read
来读取完整的球拍表达式,请注意
read bytes是有用的*可能返回时端口上只有
(x
可用,因为关闭
尚未到达。在这种情况下,实现这一点的最佳方法可能取决于对您试图实现的总体目标有更多的了解。但一般来说,我建议使用
线程
读取
——也就是说,让Racket的轻量级线程处理“非阻塞”,而不是自己处理。

线程
过程需要在新线程中运行。在创建第二个线程之前,您的代码正在进行读取(它应该会给您一个关于
thread
需要一个过程的错误)。您可能希望这样:

(thread (lambda () (read-thread pi)))

我不知道
读取字节
读取字节有用*,也许我可以用这个。但我真的不明白,我如何将它与输入端口一起使用?你能给出一些代码来证明这一点吗?看看Ryan的答案。(当我回答时,我没有注意到您已经在使用
线程
,但没有正确使用它。)