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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как лучше раздать картинку по сокетам? интересует структура... 
:(
    Опции темы
Proger10
Дата 12.5.2009, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



COVD, так там изначально получают длину данных или нет?
Код
int length = connection.getLength();


А как же я её получу, это ж поток... Который читается до тех пор пока другая сторона не закроет сокет..
PM MAIL   Вверх
COVD
Дата 12.5.2009, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

А как же я её получу, это ж поток... 

В политбюро не дураки сидят - ночью полетите (шутка). Там предлагается читать из файла (или соединения) в другой, временный поток, который по сути выполняет роль безразмерного буфера ( как ArrayList, например). После того, как чтение завершено, и, следовательно, фактическая длина данных известна, из этого временного буферного потока данные копируются в byte[], т.е. массив создается, когда уже известен необходимый размер. Это просто удобное решение, потому что не надо заранее создавать массив большого размера и увеличивать его длину при необходимости. Этим временный поток занимается.  

Это сообщение отредактировал(а) COVD - 12.5.2009, 22:44
PM MAIL   Вверх
Proger10
Дата 13.5.2009, 00:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Мы вот об этом коде?
Код
HttpConnection connection = (HttpConnection)
Connector.open("http://www.test.com/servlet/readData");

InputStream inputStream = connection.openDataInputStream();

int length = connection.getLength();
byte[] byteArray;
if (length == -1) {
// Reading from an HTTP 1.0 server or a chunked HTTP 1.1
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int c ;
while (true) {
c = inputStream.read();
if (c == -1)
break;
baos.write(c);
}
byteArray = baos.getBytes();
} else {
// Reading a Content-Length labeled payload
byteArray = new byte[length];
inputStream.readFully(byteArray);
}


А.. ну насколько я понял тут length вообще не нужен?
Идея этого кода в том, чтобы читать очередной байт через: inputStream.read() и по мере каждого байта подсчитать длину?
Чего-то походу здесь уже какая-то ошибка.. инае зачем нам повторно расширять массив и перекачивать в него данные, если мы уже при подсчёте получаем эти байты.. smile
PM MAIL   Вверх
Proger10
Дата 13.5.2009, 00:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Кстати! А что плохого вот в таком методе приёма?

Код
int c = -1;
while( ( c = socketInputStream.read() ) != -1 ) {
    fileOutputStream.write( c );
}

Потихоньку тянем файл.. Таким образом и большой вытащить получится наверное..? smile
PM MAIL   Вверх
COVD
Дата 13.5.2009, 03:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

Мы вот об этом коде?


об этом, вестимо

Цитата

Идея этого кода в том, чтобы читать очередной байт через: inputStream.read() и по мере каждого байта подсчитать длину?


читаем байт и пихаем его в ByteArrayOutputStream. Мы длину сами не подсчитываем. ByteArrayOutputStream обо всем заботится. 

Цитата

Чего-то походу здесь уже какая-то ошибка.. инае зачем нам повторно расширять массив и перекачивать в него данные, если мы уже при подсчёте получаем эти байты.. 


Смысл той заметки в том, что удобно пользоваться ByteArrayOutputStream , который всю рутинную работу сделает. Точно также, как, например, ArrayList. 

Цитата

Кстати! А что плохого вот в таком методе приёма?


Наоборот, это самый лучший вариант. Для перевалочного пункта. Например, сервлет. Он откуда-то читает (БД, файл,другой компьютер) и тут же отправляет клиенту (браузеру) не буферизуя и, следовательно, не расходуя памяти. Идеальный посредник.  А вот на клиенте, т.е. у конечного потребителя, буферизация бывает неизбежна, если данные имеют смысл только при полной загрузке. Например, jpeg. Пока картинка полностью не загрузилась, ее невозможно употребить по назначению.


Это сообщение отредактировал(а) COVD - 13.5.2009, 03:18
PM MAIL   Вверх
Platon
Дата 13.5.2009, 08:53 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(COVD @  13.5.2009,  04:09 Найти цитируемый пост)
ее невозможно употребить по назначению.

Однако браузеры справляются smile
PM MAIL ICQ   Вверх
COVD
Дата 13.5.2009, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Спасибо за поправку. Рад за браузеры smile . Ну, тогда не jpeg, а другой тип данных. Тут ведь не только вопрос умения клиента "потреблять" загружаемые данные "на лету", не дожидаясь конца загрузки. Что будет, если данные загрузятся наполовину и произойдет разрыв соединения? Клиент может попытаться повторить попытку. Если загружаемые данные накапливались в буфере, то буфер просто очищается и все начинается сначала. А что будет, если данные уже пошли в дело, породили какие-то действия, новые данные или сообщения? Откатывать назад последствия неполной обработки данных в этом случае может оказаться намного сложнее. Тут мы к понятию "транзакция" подбираемся. Хотя для клиентов это не типично, а для тонких и вообще, наверное, не применимо.

Это сообщение отредактировал(а) COVD - 15.5.2009, 12:39
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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