我正在编写一个服务器来接收 http 请求(只有 GET 方法作为学校工作简化的一部分)
我使用 Socket
类来获取连接
然后我使用 InputStream
以及 Scanner
来读取 http 请求。
但是,当我使用 hasNext()
逐行读取 http 请求 header 时。程序在 hasNext()
处挂起,等待更多输入,即使它已经消耗了所有行。
下面是我的readRequest
方法:
public void readRequest(Socket client) throws BadRequestException {
StringBuilder builder = new StringBuilder();
try {
Scanner sc = new Scanner(client.getInputStream());
sc.useDelimiter("\\r\\n");
while(sc.hasNext()){
builder.append(sc.next());
builder.append("\n");
}
parseRequestFromClient(builder.toString());
} catch (IOException e) {
throw new BadRequestException(e.getMessage());
}
最佳答案
你面临这个问题是因为 hasNext
将在后台读取源代码以检查是否有另一个匹配的标记,直到源代码通过返回 -1
到达其结尾,这是不是你这里的情况。
提醒这里是方法的 Javadoc hasNext
:
Returns true if this scanner has another token in its input. This method may block while waiting for input to scan. The scanner does not advance past any input.
您应该避免重新发明轮子并使用可以为您完成的库,例如 DavidWebb和许多其他人。
关于java - 为什么 scanner.hasNext() 在读取 Http Request 时阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39306235/