Java sun.net.HttpServer при записи в OutputStream выдает исключение IOException. Установленное соединение было прервано программным обеспечением на вашем хост-компьютере.

У меня есть HttpServer, который обслуживает файлы, используя следующий код внутри функции handle() моего обработчика.

Файл считывается на 100% с локального диска, и массив bytes[] заполняется корректно. Как только я пытаюсь записать эти байты в OutputStream os, я получаю сообщение об ошибке «IOException - установленное соединение было прервано программным обеспечением на вашем хост-компьютере».

Черт возьми, код РАБОТАЕТ - я получаю эти байты на стороне клиента, и с точки зрения клиента все работает на 100%. Помимо молчаливого игнорирования этой ошибки, есть ли что-нибудь еще, что я должен проверить?

@Override
public void handle(HttpExchange t) throws IOException
{

    //I heard it was a good idea to consume the input stream fully:
    InputStream is = t.getRequestBody();
    while (is.read() != -1) {
        is.skip(0x10000);
    }
    is.close();

    String path = t.getRequestURI().getPath();
    String method = t.getRequestMethod();

    if (! ("HEAD".equals(method) || "GET".equals(method)))
    {
        sendError(t, 400, "Invalid method");
        return;
    }

    ... snipped some path validation and error checking ...

    try
    {
        Headers h = t.getResponseHeaders();
        h.set("Content-Type", "text/html");
        h.set("Access-Control-Allow-Methods", "GET");
        h.set("Access-Control-Allow-Headers", "Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since");
        h.set("Access-Control-Allow-Origin", "*");
        h.set("Timing-Allow-Origin", "*");
        //Set aggressive caching:
        h.set("Cache-Control", "public, max-age=31536000");

        File f = new File(baseDirectory + path).getCanonicalFile();

        if (!f.exists() || !f.isFile())
        {
            sendError(t, 404, "Not found");
            return;
        }

        byte[] bytes = Files.readAllBytes(Paths.get(f.getPath()));

        t.sendResponseHeaders(200, bytes.length);

        OutputStream os = t.getResponseBody();

        //ERROR HAPPENS HERE:
        os.write(bytes);
        os.close();

    }
    catch (Exception e)
    {   
        Main.log("HTTP: Error trying to read file "+path+": "+ e.toString());
    }


    t.close();
}

person Mikepote    schedule 22.08.2018    source источник


Ответы (1)


Бьюсь об заклад, вы используете хром,

Если chrome не устраивает скорость соединения, он отправляет еще один запрос GET и отменяет самый медленный, что приводит к исключению «Установленное соединение было прервано ...».

следовательно, ошибка в журнале при получении полного файла.

person clausr    schedule 25.03.2019