Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> URL connection, соединение по url 
V
    Опции темы
serghd
Дата 9.10.2009, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 5.10.2009

Репутация: нет
Всего: нет



Наверняка кто-нибудь из опытных ява-программистов (сам я ещё зелёный, до этого 4 года писал на php) сталкивался.
Часть кода:
Код

  URL hp = new URL("http://google.com");
  URLConnection hpCon = hp.openConnection();
  System.out.println("Date: " + new Date(hpCon.getDate()));
  System.out.println("Type of content: " + hpCon.getContentType());
  System.out.println("How old: " + hpCon.getExpiration());
  System.out.println("Last edit: " + new Date(hpCon.getLastModified()));
  int len = hpCon.getContentLength();
  System.out.println("Content-Length: " + len); 

Вывод:
Date: Fri Oct 09 21:32:03 MSD 2009
Type of content: text/html; charset=windows-1251
How old: 0
Last edit: Thu Jan 01 03:00:00 MSK 1970
Content-Length: -1

Вопрос в том, почему getContentLength() возвращает -1, а не число символов контента? Хотя все остальные данные возврата верны. 

Это сообщение отредактировал(а) serghd - 9.10.2009, 20:35
PM MAIL   Вверх
COVD
Дата 9.10.2009, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 11
Всего: 43



Вызов openConnection() - это еще не отсылка запроса. Это типичное заблуждение. Вы смотрите значения параметров в момент когда запрос еще не был отослан. Следовательно, не был получен ответ. Следовательно длина ответа неизвестна, т.е. -1. Если сервер пришлет ответ мелкими порциями, т.е. в режиме chunked, то в хедере ответа полная длина также не будет указана, потому что сервер при отправке хедера не знал полную длину отсылаемых данных. Например, извлекал их из базы данных и по мере извлечения отправлял.    
PM MAIL   Вверх
serghd
Дата 9.10.2009, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 5.10.2009

Репутация: нет
Всего: нет



да, но
1) неизвестная длина ответа только контента, остальные данные были получены (или они выдаются независимо от того, был запрос или нет?);
2) писалось это на основе руководства по яве, там всё почему-то работает как надо, хотя код тот же.

>>"Вызов openConnection() - это еще не отсылка запроса."
Тогда что есть отсылка?


Это сообщение отредактировал(а) serghd - 9.10.2009, 21:09
PM MAIL   Вверх
COVD
Дата 9.10.2009, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 11
Всего: 43



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

Цитата

Тогда что есть отсылка?


Запрос отсылается после вызова getInputStream() или getResponseCode() (если используете HttpURLConnection, наследника URLConnection). Возможно также getResponseMessage() . Именно в этот момент, означающий, что вы окончательно закончили формировать запрос и перешли к обработке ответа, и отсылаются данные на сервер. После вызова этих методов любая попытка что-то дослать на сервер через данное соединение ( например, вызвав getOutputStream() ) вызовет выброс исключения. Поэтому для каждой пары запрос-ответ надо создавать новый обьект URLConnection или HttpURLConnection. При этом может использоваться одно физическое сокетное соединение с сервером, но это скрыто от программиста. 

P.S.
Цитата

2) писалось это на основе руководства по яве, там всё почему-то работает как надо, хотя код тот же.

Вы невнимательно читали руководство. Или автор руководства невнимательно читал другое руководство. Или я ошибаюсь. Всякое бывает : )

Это сообщение отредактировал(а) COVD - 9.10.2009, 21:51
PM MAIL   Вверх
serghd
Дата 10.10.2009, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 5.10.2009

Репутация: нет
Всего: нет



Руководство: JAVA 2. П. Ноутон, Г. Шилдт., страницы 561-562. Не знаю опечатка там, недопечатка или ещё что-нибудь...
Книгу эту изучаю первой (из 5-ти), так что она у меня в новом для меня языке JAVA "первопроходец".
Полностью делал по примеру на указанных страницах, но длина потока всё равно была -1. 
Проблему решил (после перебора многих других вариантов) следующим образом:
Код

package mypackage1;

import java.io.*;
import java.net.*;

public class Example
{
 public static void main(String args[]) throws Exception
 {
  String res = "", s;
  URL hp = new URL("http://google.com");
  URLConnection hpCon = hp.openConnection();

  BufferedReader reader = new BufferedReader(new InputStreamReader(hpCon.getInputStream()));
  while((s = reader.readLine()) != null) {
     res += s + "\r\n";
   }
  System.out.println(res);
 }
}

Всё оказалось более чем просто (хотя hpCon.getContentLength() всё равно -1, но это уже наверное другая тема). Против опыта не пойдёшь, тем не менее "проблема" решена.


Это сообщение отредактировал(а) serghd - 10.10.2009, 19:27
PM MAIL   Вверх
COVD
Дата 10.10.2009, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 11
Всего: 43



Цитата

хотя hpCon.getContentLength() всё равно -1
,

это chunked - в хедере респонса есть поле Transfer-Encoding = chunked, а поля Content-Length нет.
http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.6
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Работа с сетью | Следующая тема »


 




[ Время генерации скрипта: 0.1178 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.