java - 为什么 scanner.hasNext() 在读取 Http Request 时阻塞

标签 java http

我正在编写一个服务器来接收 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/

相关文章:

java - 从 56 位二进制字符串创建 DES key

java - 在Java中对两个相同名称的文本文件进行排序

java - 无法从 java 代码读取 URL

java - 为什么我从 Jakarta Commons HttpClient 收到空请求?

http - 什么响应代码适合这种情况?

java - 从 Fragment 中访问 ActionBar

java - 在 Eclipse 3.7 中编译时有什么方法可以隐藏某些代码片段吗?

java - 在纯 JPA 设置中获取数据库连接

php - 在 PHP 中解析 HTTP_RANGE header

Python 请求得到响应 [200] 但表单未填写