Форум: "Сети";
Текущий архив: 2004.11.14;
Скачать: [xml.tar.bz2];
ВнизПередача картинки по http. Найти похожие ветки
← →
Гость (2004-09-06 10:52) [0]Есть приложение c TServerSocket, которое слушает по порту 8080 и на любой запрос отправляет картинку (jpeg) в виде потока (SendStream()). В кач-ве клиента получающего картинку - браузер. Так вот, картинка не доходит до клиента целиком. Т.е headers сформированы правильно в соответствии с RFC, браузер понимает что это за контент и пытается его отобразить, однако, получает только часть картинки и в окне показывает только "макушку" изображения.
Я понимаю, что она рубится на куски для передачи по сети взависимости от загруженности сети и.т.п, но как заставить браузер принять все пакеты? Или иными словами, как отослать всё так, чтобы эксплорер принял картинку полностью?
← →
Digitman © (2004-09-06 13:59) [1]
> как отослать всё так, чтобы эксплорер принял картинку полностью?
как минимум - не разрывать соединение на стороне сервера до тех пор пока существует объект, переданный параметром в метод SendStream()
← →
Гость (2004-09-06 14:09) [2]Да вроде этого нет. Т.е соединение я не рву раньше времени.
Или я чего не понял?
Покажите кусочек кода если не трудно, как это делать правильно.
← →
Digitman © (2004-09-06 14:15) [3]
> раньше времени
раньше КАКОГО времени ? и по чьей инициативе оно вообще разрывается у тебя ? клиента или сервера ?
← →
Гость (2004-09-06 14:36) [4]Я полагал, что пока не доработает SendStream() дальнейшего выполнения программы не будет. Или я не прав?
Вообще-то, когда программа запущена и привязана к localhost:8080, при обращении к ней, клиент получает картинку полностью.
А вот при таком-же обращении но через инет, приходит только кусок.
← →
Digitman © (2004-09-06 14:41) [5]
> Или я не прав?
для non-blocking-режима - не прав
← →
Гость (2004-09-06 14:57) [6]
> > Или я не прав?
>
>
> для non-blocking-режима - не прав
опа...
Получается, что я закрываю коннект как-то рановато...
Всеравно непонятно, почему тогда в разных условиях браузер получает то меньшую то большую часть картинки, а иногда и всю целиком.
Уважаемый, дайте плиз ссылку или пример кода посмотреть.
Я, в общем, сообразительный :). Пойму, где собака порылась.
← →
Digitman © (2004-09-06 15:08) [7]
> Получается, что я закрываю коннект как-то рановато
вот именно
поэтому и спросил тебя, в какой момент времени и при каких условиях ты закрываешь коннект на той или иной стороне
> Всеравно непонятно, почему тогда в разных условиях браузер
> получает то меньшую то большую часть картинки, а иногда
> и всю целиком
это сильно зависит от сетевой среды, не вдавайся в эти подробности и сосредоточься на ПРАВИЛЬНОЙ организации транспортной логики, не зависящей от сетевой среды
> в общем, сообразительный :). Пойму, где собака порылась
объект-стрим, переданный параметром в метод SendStream(), после успешной "передачи" его данных будет автоматически разрушен объектом, метод SendStream() которого вызван
как вариант, можно объявить и реализовать своего наследника стрим-класса, экз-р которого передается в метод SendStream()
тогда момент вызова деструктора этого объекта и будет фактом постановки в очередь на передачу всех данных, хранимых в стриме
← →
Гость (2004-09-06 15:30) [8]
> как вариант, можно объявить и реализовать своего наследника
> стрим-класса, экз-р которого передается в метод SendStream()
> тогда момент вызова деструктора этого объекта и будет фактом
> постановки в очередь на передачу всех данных, хранимых в
> стриме
Т.е onDestroy или как оно там обзывается, того класса, я должен буду вызвать процедуру дисконнекта?
Странно все-таки смотрится. Это как удалять гланды через... извиняюсь.. :), в случае, конечно, если я правильно понял...
Другого более изящного решения нет, случайно?
Ну не могет быть чтобы контроль за передачей в TServerSocket был реализован так, мягко говоря, некрасиво...
Я вообще мало писал на паскале, но по опыту других языков и сред предполагаю, что есть другое решение.
← →
Reindeer Moss Eater © (2004-09-06 15:40) [9]некрасиво
Скорее не синхронно, чем не красиво.
А даже если и не красиво, - тебе жениться что ли на нем?
← →
Digitman © (2004-09-06 15:44) [10]
> Другого более изящного решения нет, случайно?
самое "изящное" решение : коннект должен разрываться не по инициативе передатчика, а по инициативе приемника, после того как приемник полностью получил запрошенные данные
← →
Гость (2004-09-06 15:54) [11]
> Скорее не синхронно, чем не красиво.
> А даже если и не красиво, - тебе жениться что ли на нем?
Речь скорее не о красоте, а о том что вряд-ли это правильный способ. Не могу поверить что борландовцы в своем компоненте не предусмотрели что-либо на такой случай.
> самое "изящное" решение : коннект должен разрываться не
> по инициативе передатчика, а по инициативе приемника, после
> того как приемник полностью получил запрошенные данные
Вот об этом хочется поподробнее, если можно.
← →
Digitman © (2004-09-06 16:05) [12]
> Гость (06.09.04 15:54) [11]
у тебя браузер соединяется с сервером через прокси или напрямую ?
← →
Гость (2004-09-06 16:14) [13]
> у тебя браузер соединяется с сервером через прокси или напрямую
> ?
Я хотел бы рассчитывать и на вариант с прокси и на вариант без него.
← →
Digitman © (2004-09-06 16:24) [14]
> Гость (06.09.04 16:14) [13]
почитай для начала здесь
http://book.itep.ru/4/45/http4561.htm#4.5.6.1.7
← →
Гость (2004-09-06 17:01) [15]О, да! :)
А еще RFC перечитать можно. :)
Понимаете, если бы у меня было время читать столько доков, я бы не писал в форумы.
Есть такой момент: в моем приложении все работает кроме передачи картинок. И мне достаточно найти кусок кода, который демонстрирует как это делать. Дело в том, что в мои планы не входило дальше продолжать самообразование по этой теме, тем более что моя основная работа никак не связана с проблемами подобными этой и писать на паскале что-нить еще в течение текущей и двух-трех следующих жизней ничего не планирую.
Господа, если есть примеры кода или ссылки на них - поделитесь пожалуйста. Может где нибудь кто встречал примеры простейшего httpd сервера могущего отдать картинки. Я был бы очень признателен.
Когда мне понадобится углубленно изучить вопрос, я поверьте, сам найду документацию, и время на её прочтение.
Заранее спасибо.
← →
Digitman © (2004-09-06 18:05) [16]
> Гость (06.09.04 17:01) [15]
> О, да! :)
> А еще RFC перечитать можно. :)
совершенно никчемный сарказм
все что тебе предлагалось - это найти ответ на свой вопрос в одном небольшом абзаце :
7.1.2.1. Согласование
HTTP/1.1 сервер может предполагать, что HTTP/1.1 клиент намерен поддерживать постоянное соединение, если только в поле заголовка Connection не записана лексема "close". Если сервер принял решение закрыть связь немедленно после посылки отклика, ему рекомендуется послать заголовок Connection, включающий лексему связи close.
Клиент HTTP/1.1 может ожидать, что соединение останется открытым, но примет решение оставлять ли его открытым на основе того, содержит ли отклик сервера заголовок Connection с лексемой close.
Если клиент или сервер посылает лексему close в заголовке Connection, этот запрос становится последним для данного соединения.
Клиентам и серверам не следует предполагать, что соединение будет оставаться постоянным для версий HTTP, меньше 1.1, если только не получено соответствующее уведомление.
> в мои планы не входило дальше продолжать самообразование
> по этой теме
твое право
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2004.11.14;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.032 c