【发布时间】:2016-09-13 01:36:17
【问题描述】:
我正在尝试从 Java 中的 Socket 读取和输入,然后通过调用函数对其进行处理。我必须按字节而不是按文本阅读,因为由于来自客户端的请求,作为文本阅读会产生一些错误。所以我决定使用BufferedInputStream这个类。问题是没有检测到请求的结束。我猜这是因为流并没有结束只是被绞死或其他什么......
根据documentation,read() 函数返回从流中读取的字节,如果流已经结束,则返回-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()函数)中运行的,不知道这是否会搞砸,所以我在这里添加了最后一条信息。无论如何,我在这里错过了什么?谢谢。
编辑:没有客户端代码,因为我正在使用来自 google 的应用程序 POSTMAN 对其进行测试,所以它只是向我的程序发送 HTTP 请求。
【问题讨论】:
-
它可能会挂起 reader.read() 等待来自流的数据。我可以看到写入流的代码吗?
-
没有代码,我用的是谷歌浏览器的 Postman (chrome.google.com/webstore/detail/postman/…)