gpt4 book ai didi

sockets - BufferedReader-在流的末尾阻塞

转载 作者:行者123 更新时间:2023-12-03 12:04:00 27 4
gpt4 key购买 nike

我正在编写一些使用clojure.async的函数,以从读取/写入套接字抽象出来。我的目的是可以将值放入 channel 中以进行写入,并从要读取的 channel 中弹出。这样,用户无需担心ReaderWriter

下面的代码循环读取套接字中的内容,并将其读取的内容转发到 channel 中。返回 channel ,以便可以读取它。我的问题是,当到达流的末尾时,它坐在那里旋转而不是阻塞,直到可以读取某些内容为止。如果我要执行其中的一些过程,那么它将在我的计算机上引起明显的性能问题。

我可以看到解决此问题的最简单方法是在EOF上使用BufferedReaderreadLine块,而不是返回nil。从我所见,这是不可能的。不过,这并不令我感到惊讶,因为对于大多数流而言,阻止EOF将是非常奇怪的。对于套接字流,EOF似乎没有特定的含义,因为即使到达EOF仍然可以接收消息。

一旦达到EOF,有没有办法防止循环在等待输入时旋转?

(ns chat.so-example
(:require [clojure.core.async :as a :refer [chan go >!]])
(:import [java.net Socket SocketException]
[java.io BufferedReader InputStreamReader InputStream]))

(defn valid-message? [msg]
(and (some? msg)
(not (empty? msg))))

(defn new-input-chan [^Socket sock]
(let [^InputStream in (.getInputStream sock)
buff-reader (BufferedReader. (InputStreamReader. in))
in-chan (chan)]
(go
(try
(while (.isConnected sock) ; This spins when EOF is reached
(let [line (.readLine buff-reader)]
(when (valid-message? line)
(>! in-chan line))))
(catch SocketException se
(#_"Handle exception"))
(finally
(a/close! in-chan))))
in-chan))

最佳答案

唯一在这里旋转的是你。您正在使用的类中的方法均未旋转。阅读isConnectedisClosedisInputShutdown的文档,解决方案应该变得清晰。它还可以帮助您阅读readLine的描述,该描述非常清楚在没有更多输入要读取时返回的内容。

关于sockets - BufferedReader-在流的末尾阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41202896/

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