Некоторые вопросы о записи на ответном потоке ASP.NET

Я нашел способ получить имя клиентской машины.

public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 

    Logger.getLogger(this.getClass()).warning("Inside Confirm Servlet");  
    response.setContentType("text/html");

    String hostname = request.getRemoteHost(); // hostname
    System.out.println("hostname"+hostname);

    String computerName = null;
    String remoteAddress = request.getRemoteAddr();
    System.out.println("remoteAddress: " + remoteAddress);
    try {
        InetAddress inetAddress = InetAddress.getByName(remoteAddress);
        System.out.println("inetAddress: " + inetAddress);
        computerName = inetAddress.getHostName();

        System.out.println("computerName: " + computerName);


        if (computerName.equalsIgnoreCase("localhost")) {
            computerName = java.net.InetAddress.getLocalHost().getCanonicalHostName();
        } 
    } catch (UnknownHostException e) {

        }

    System.out.println("computerName: " + computerName);
}    
25
задан vtortola 2 April 2010 в 21:36
поделиться

3 ответа

  1. Да; это нормально.
  2. Если вы никогда не выполните сброс, браузер не получит никакого ответа, пока сервер не завершит работу (даже заголовок Content-Disposition). Поэтому он не знает, чтобы показать диалог файла.
  3. Заголовок Content-Length устанавливается только в том случае, если весь ответ буферизирован (если вы никогда не сбрасываете) или если вы установили его самостоятельно. В этом случае вы можете и должны установить это самостоятельно; написать

    response.AppendHeader("Content-Length", new FileInfo(path).Length.ToString());
    
  4. Я рекомендую 4K; У меня нет твердой основы для рекомендации.
  5. Этот метод - лучший способ сделать это. Вызвав Flush внутри цикла, вы немедленно отправляете ответ по линии без какой-либо буферизации. Однако для повышения производительности вы можете использовать сжатие GZIP.
17
ответ дан Warlike Chimpanzee 28 November 2019 в 21:52
поделиться

Для # 3 вам нужно установить заголовок длины содержимого в вашем http-ответе. Многие из этих значений взяты из заголовков http.

Я полагаю, что вы можете изменить буферизацию, изменив свойство буферизации объекта ответа на false. Давно не делал этого, поэтому я не помню, что это может быть.

2
ответ дан Min 28 November 2019 в 21:52
поделиться
  1. Да, это буферизация.
  2. Flush отправляет кэшированное содержимое в браузер. Если его не нажать, диалоговое окно сохранения не появится.
  3. Трудно сказать, не видя точных файлов / URL / потоков, которые вы используете.
  4. Я думаю, что факторы зависят от того, насколько медлительна ваша страница на самом деле. У вас будет лучшая производительность в сторону 4k. И, возможно, меньшее значение будет лучше для более медленных соединений.
  5. См. №1 и 2.
2
ответ дан 28 November 2019 в 21:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: