gpt4 book ai didi

sockets - 如何知道继续从套接字输入流读取是否安全(避免读取 block )

转载 作者:行者123 更新时间:2023-12-05 07:59:59 25 4
gpt4 key购买 nike

我先给你一些背景知识:

我有一个类应该在套接字中写入一些查询然后读取答案。这是应该从 inputStream 中读取的代码:

private String getDataFromInputStream() throws IOException
{
StringBuilder sb = new StringBuilder();

InputStream stream = this.socket.getInputStream();

byte[] buff = new byte[1024];
int bytesRead = 0;

while(bytesRead >= 0)
{
bytesRead = stream.read(buff);

if (bytesRead > 0) sb.append(new String(buff, 0, bytesRead));
}

return sb.toString();
}

如果返回的结果没问题,这个方法效果很好,但是如果由于某种原因,InputStream.read 一直在等待输入,当然会阻塞。

所以我把代码改成了这个:

private String getDataFromInputStream() throws IOException
{
StringBuilder sb = new StringBuilder();

InputStream stream = this.socket.getInputStream();

byte[] buff = new byte[1024];
int bytesRead = 0;

while(stream.available() > 0)
{
bytesRead = stream.read(buff);

if (bytesRead > 0) sb.append(new String(buff, 0, bytesRead));
}

return sb.toString();
}

但是新问题来了:第二段代码没有读取整个响应。它只返回完整响应的一个片段。

我知道 available() 方法返回 0,因为流在​​缓冲区中没有更多数据要读取,但是有更多数据要从套接字中读取。

那么我怎样才能使方法足够灵活以读取整个内容,即使它需要一些时间到 Stream 来缓冲响应,并且在期望输入时也不会阻塞?

如果查询成功,我需要获得完整的响应并关闭输入,这样它就不会阻塞,如果命令失败并且套接字需要任何输入。

最佳答案

由于您使用的是套接字,因此您需要源来告诉您它要发送多少数据。这可能出现在发送的前几个字节中(在这种情况下,您首先等待特定数量的字节),否则您将不得不修改源以提供该信息。这也是 TCP 和 UDP 数据包所做的,其中数据包的 header 包括数据的长度,以便客户端知道要等待多少字节。

关于sockets - 如何知道继续从套接字输入流读取是否安全(避免读取 block ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19729210/

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