Я создал PrintWriter с включенной автозаполнением; почему это не автоматическая промывка? - PullRequest
7 голосов
/ 06 августа 2009

Мой клиент является веб-браузером и отправляет запрос на myserver, используя этот URL: http://localhost

Это код на стороне сервера. Проблема заключается в методе run класса ServingThread.

class ServingThread implements Runnable{
    private Socket socket ;

    public ServingThread(Socket socket){
        this.socket = socket ;
        System.out.println("Receives a new browser request from "
                      + socket + "\n\n");
    }

    public void run() {
        PrintWriter out = null ;

        try {
            String str = "" ;
            out = new PrintWriter( socket.getOutputStream() ) ;
            out.write("This a web-page.") ;
            // :-(
            out.flush() ;
            // :-(
            socket.close() ;
            System.out.println("Request successfully fulfilled.") ;
        } catch (IOException io) {
            System.out.println(io.getMessage());
        }
    }
}

Использую ли я

out = new PrintWriter( socket.getOutputStream(), true ) ;

или

out = new PrintWriter( socket.getOutputStream() ) ;

вывод не поступает в браузер. Вывод поступает в браузер только в том случае, если я вручную выполняю сброс с использованием потока, используя

out.flush() ;

Мой вопрос: new PrintWriter( socket.getOutputStream(), true ) должен автоматически очищать буфер вывода, но это не так. Почему?

1 Ответ

20 голосов
/ 07 августа 2009

Из Javadocs :

Параметры:

out - выходной поток
autoFlush - логическое значение; если true, методы println, printf или format очистят буфер вывода

Это не означает, что write() очистит буфер вывода. Попробуйте вместо этого использовать println(), и он должен сбрасываться так, как вы ожидаете.

...