gpt4 book ai didi

java - 如何使用 BufferedInputStream 检测 Socket 输入流的结束?

转载 作者:行者123 更新时间:2023-12-01 21:19:06 24 4
gpt4 key购买 nike

我正在尝试从Java中的Socket读取和输入,然后通过调用函数来处理它。我必须按字节读取而不是按文本读取,因为由于来自客户端的请求,以文本读取会出现一些错误。所以我决定使用 BufferedInputStream 类。问题是未检测到请求的结束。我想这是因为流并没有结束只是被挂起或其他什么......

根据documentationread() 函数返回从流中读取的字节,如果流已结束,则返回 -1。因此,我的代码逐字节读取,将其连接到一个字符串中,然后,当流结束时,发送要处理的字符串(或者至少应该这样做)。这是代码:

BufferedInputStream reader = new BufferedInputStream(socket.getInputStream());
int dt;
String cmd = "";

while( (dt = reader.read()) >= 0){
cmd += (char)dt == '\n' || (char)dt == '\r' ? ' ' : (char)dt; // add each byte read to the string
System.out.println(cmd);
}

processaInput(cmd);

问题是函数processaInput永远不会被调用,就像程序卡在循环中一样。但更奇怪的是,它并没有陷入循环,因为 system.out.println 在流结束后停止被调用。顺便说一句,这段时间是在线程(run() 函数)中运行的,不知道这是否会造成困惑,所以我在这里添加了最后一个信息。无论如何,我在这里缺少什么?谢谢。

编辑:没有客户端代码,因为我正在使用应用程序 POSTMAN从google来测试它,所以它只是向我的程序发送HTTP请求。

最佳答案

您将“请求结束”与“流结束”混为一谈。

套接字上的“流结束”表示对等方已关闭连接。没有流的结束,没有对等点的关闭。如果您计划将响应写回此套接字,则尝试首先将其读取到流末尾是不正确的。

您正在尝试读取单个请求,在这种情况下,您需要应用程序协议(protocol)中的某些内容来告诉您何时拥有所有内容:行;长度单词前缀;像 XML 这样的自描述协议(protocol); STX/ETX;类型-长度-值; ...

在这种情况下,如果协议(protocol)是 HTTP,您需要实现 Content-length header :识别它,读取到 header 的末尾,然后从流中准确读取那么多字节,例如使用DataInputStream.readFully()

关于java - 如何使用 BufferedInputStream 检测 Socket 输入流的结束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39461018/

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