Вверх ↑
Этот топик читают: Гость
Ответов: 893
Рейтинг: 18
#1: 2008-05-13 14:38:49 ЛС | профиль | цитата
Помогите загрузить картинку в браузер ума не приложу в чём дело , ну никак не получается заставить браузер отобразить картинку.
В прилогаемой схеме эмуляция проксисервера.
code_9037.txt
карма: 0
Время верстки: %cr_time% Текущее время: %time%
0
файлы: 1code_9037.txt [2.7KB] [188]
Ответов: 2125
Рейтинг: 159
#2: 2008-05-13 15:32:54 ЛС | профиль | цитата
А ты уверен, что складывать бинарные данные в список строк, а потом выдавать это за картинку - это правильно?
Как минимум, будут добавлены символы
посреди бинарных данных, а если в данных нули будут, то после первого нуля данные обрежутся.
Надо складывать в MemoryStream.

Если у тебя соединение через прокси, то надо коннектиться к нему. А если ты коннектишься сразу к hiasm.com, то не надо писать GET http://hiasm.com/small.png, надо писать сразу GET /small.png.
Прокси-сервер выкусывает из запроса имя протокола и сайта, и коннектится к выкушенному сайту "hiasm.com" по выкушенному протоколу "http"

карма: 1

0
Ответов: 893
Рейтинг: 18
#3: 2008-05-13 15:42:48 ЛС | профиль | цитата
tsdima писал(а):
А если ты коннектишься сразу к hiasm.com, то не надо писать GET http://hiasm.com/small.png, надо писать сразу GET /small.png.

Так браузер написал , я и скопировал весь запрос.
А насчёт бинарного кода я считал что там текст а не бинарный код , так как быть с картинкой то ?
карма: 0
Время верстки: %cr_time% Текущее время: %time%
0
Ответов: 2125
Рейтинг: 159
#4: 2008-05-13 16:06:22 ЛС | профиль | цитата
Byuik писал(а):
Так браузер написал , я и скопировал весь запрос.

Правильно, ты ж наверное свою прогу ему как прокси подсунул, вот он к твоей проге как к прокси и обращается.

Byuik писал(а):
А насчёт бинарного кода я считал что там текст а не бинарный код , так как быть с картинкой то ?

Сначала текст (заголовок ответа), а после пустой строки - бинарные данные (картинка). Но тебе должно быть всё равно, ты должен 1-в-1 ответ браузеру передать.


карма: 1

0
Ответов: 893
Рейтинг: 18
#5: 2008-05-13 17:36:57 ЛС | профиль | цитата
tsdima писал(а):
Но тебе должно быть всё равно, ты должен 1-в-1 ответ браузеру передать.

Та значит нужно отделить бинарные данные от текстовых , передать заголовок , а потом откодировать бинарные данные в текст и отправить их ?
тогда поставим вопрос по другому: Как отделить бинарные данные от текстовых , стандартными компонентами ?
карма: 0
Время верстки: %cr_time% Текущее время: %time%
0
Ответов: 2125
Рейтинг: 159
#6: 2008-05-13 17:48:52 ЛС | профиль | цитата
Byuik писал(а):
Та значит нужно отделить бинарные данные от текстовых , передать заголовок , а потом откодировать бинарные данные в текст и отправить их ?

ЗАЧЕМ? То, что ты получишь в ответ от hiasm.com нужно без изменений передать твоему браузеру, просто соедени точки onRead --- doSend.
карма: 1

0
Ответов: 893
Рейтинг: 18
#7: 2008-05-13 22:41:05 ЛС | профиль | цитата
tsdima писал(а):
просто соедени точки onRead --- doSend.

Уже соединял и ничего хорошего не вышло так как текстовые данные пересылаются без проблем а вот картинки нет

вот пример

code_2224.txt

[size=-2]------ Добавлено в 19:49
Так чтоже делать то ?
------------ Дoбавленo:

Вот последний вариант схемы


Add(WinExec,13764212,-211,21)
{
}
Add(MainForm,10980145,-498,112)
{
Left=30
Top=25
Width=514
Height=318
Color=-16777211
Ctl3D=0
Position=1
link(onCreate,5599860:doEvent1,[])
}
Add(TCP_Server,4135803,-316,126)
{
Port=8787
link(onConnect,4076891:doString,[])
}
Add(MultiElement,6597573,-386,126)
{
@Hint=#17:Получаем IP адрес|
}
BEGIN_SDK
Add(EditMulti,4360547,21,21)
{
EventCount=1
WorkCount=1
VarCount=1
link(doWork1,16203229:doStart,[(53,27)(53,76)])
link(Var1,8134498:Value,[(27,183)(258,183)])
}
Add(Ping,1255917,133,70)
{
Name="hiasm.com"
link(onFind,14781330:doEvent1,[])
}
Add(Thread,16203229,84,70)
{
Delay=1
FastStop=0
link(onExec,1255917:doPing,[])
}
Add(Memory,8134498,252,70)
{
}
Add(Hub,14781330,182,70)
{
link(onEvent1,8134498:doValue,[])
link(onEvent2,4360547:onEvent1,[(268,83)(268,27)])
}
END_SDK
Add(TCP_Client,10443136,20,133)
{
Port=80
IP="127.0.0.1"
link(onRead,14424499:doEvent1,[])
link(onDisconnect,2110309:doEvent1,[(88,153)(88,356)])
link(IP,6597573:Var1,[(26,112)(-177,112)(-177,170)(-380,170)])
}
Add(Hub,13514632,-92,133)
{
link(onEvent1,10443136:doOpen,[])
link(onEvent2,9999937:doEvent1,[(-50,146)(-50,195)])
}
Add(Hub,9999937,-43,189)
{
InCount=2
link(onEvent2,10443136:doSend,[(7,202)(7,153)])
}
Add(If_else,16313029,-141,133)
{
Op2=Integer(0)
link(onTrue,13514632:doEvent1,[])
link(onFalse,9999937:doEvent2,[(-74,146)(-74,202)])
link(Op1,10443136:Active,[(-135,119)(-23,119)(-23,177)(26,177)])
}
Add(Hub,5599860,-442,126)
{
link(onEvent1,6597573:doWork1,[])
link(onEvent2,4135803:doOpen,[(-361,139)(-361,132)])
}
Add(FormatStr,14028257,468,448)
{
Mask="%2Content-Length: %1

"
link(onFString,10537171:doWork2,[(522,454)(522,419)])
link(Str1,14189494:Result,[(474,432)(446,432)])
link(Str2,6337181:Text,[(481,282)(446,282)])
}
Add(Hub,14424499,69,133)
{
OutCount=3
link(onEvent1,14072042:doSearch,[])
link(onEvent2,6311993:doCompare,[(116,146)(116,188)])
}
Add(FormatStr,4076891,-239,133)
{
DataCount=0
Mask="GET /tpl/small.png HTTP/1.0
User-Agent: Opera/9.27 (Windows NT 5.1; U; ru)
Host: hiasm.com
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: ru-RU,ru;q=0.9,en;q=0.8
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0
Proxy-Connection: close

"
link(onFString,16313029:doCompare,[])
}
Add(InfoTip,3965022,-265,84)
{
Info=#25:Эмулируем запрос картинки|
Width=105
Height=115
}
Add(Button,10630722,-267,28)
{
Width=506
Height=60
Align=2
Color=-16777211
Ctl3D=0
Caption="Form"
Data=String(http://localhost:8787/small.png)
link(onClick,13764212:doShellExec,[])
}
Add(Delete,11972875,230,189)
{
link(onDelete,16516086:doEvent1,[])
link(Count,16056857:Result,[(250,181)(369,181)])
}
Add(BlockFind,14072042,125,133)
{
StartBlock="HTTP"
EndBlock="

"
link(onSearch,15986010:doValue,[])
}
Add(Hub,6708592,370,189)
{
InCount=2
link(onEvent1,6040693:doAdd,[(421,195)(421,314)])
}
Add(HubEx,10537171,545,406)
{
link(onEvent,14263389:In,[])
}
Add(Hub,2110309,328,350)
{
OutCount=5
link(onEvent1,14189494:doLength,[(400,356)(400,391)])
link(onEvent2,14028257:doString,[(414,363)(414,454)])
link(onEvent3,6620762:doData,[(428,370)(428,391)])
link(onEvent4,6040693:doClear,[(400,377)(400,321)])
}
Add(StrList,6337181,440,112)
{
}
Add(If_else,13798232,244,133)
{
Op2=Integer(0)
link(onFalse,13358344:doEvent1,[(292,146)(292,139)])
}
Add(Hub,13358344,307,133)
{
InCount=2
OutCount=4
link(onEvent1,10075596:doReplace,[(355,139)(355,104)])
link(onEvent2,16056857:doLength,[])
link(onEvent3,14497254:doEnum,[(428,153)(428,181)])
}
Add(Memory,15986010,181,133)
{
Default=Integer(0)
link(onData,13798232:doCompare,[])
}
Add(If_else,6311993,181,182)
{
link(onTrue,6708592:doEvent2,[(291,188)(291,202)])
link(onFalse,11972875:doDelete,[])
link(Op1,15986010:Value,[])
}
Add(Hub,16516086,272,189)
{
link(onEvent1,6708592:doEvent1,[])
link(onEvent2,15986010:doClear,[(317,202)(317,174)(169,174)(169,146)])
}
Add(Length,16056857,363,140)
{
}
Add(DoData,10200995,524,217)
{
link(onEventData,6337181:doDelete,[(568,223)(568,97)(432,97)(432,132)])
link(Data,14497254:Index,[])
}
Add(LineBreak,7508312,-379,189)
{
link(Out,4135803:doSend,[(-333,195)(-333,146)])
Primary=[14263389,966,224]
}
Add(BlockFind,15463695,622,175)
{
IncludeBlock=1
StartBlock="Content-Length: "
EndBlock="
"
link(onSearch,10200995:doData,[(660,181)(660,259)(512,259)(512,223)])
}
Add(StrList,6040693,440,308)
{
}
Add(Length,14189494,440,385)
{
link(Str,2857234:Var2,[])
}
Add(ArrayEnum,14497254,517,175)
{
link(onItem,7548148:doEvent1,[])
link(Array,6337181:Array,[(523,166)(460,166)])
}
Add(DoData,6620762,496,385)
{
link(onEventData,10537171:doWork1,[(549,391)])
link(Data,2857234:Var3,[(502,373)])
}
Add(GetDataEx,2857234,433,364)
{
link(Data,6040693:Text,[])
}
Add(Replace,10075596,370,98)
{
SubStr="

"
link(onReplace,6337181:doText,[(421,104)(421,139)])
}
Add(Hub,7548148,559,175)
{
link(onEvent1,15463695:doSearch,[])
}


карма: 0
Время верстки: %cr_time% Текущее время: %time%
0
файлы: 1code_2224.txt [2.5KB] [162]
Ответов: 2125
Рейтинг: 159
#8: 2008-05-14 13:41:14 ЛС | профиль | цитата
Byuik писал(а):
Уже соединял и ничего хорошего не вышло

Вполне возможно, что у тебя не последняя версия hiTCP_Client.pas, возьми с SVN http://hiasm.googlecode.com/svn/elements/delphi/code/hiTCP_Client.pas
Я пару месяцев назад делал изменение, чтобы строки с нулями посередине не обрезались в onRead.
doSend не обрезает стопудово.

------------ Дoбавленo:

Тебе чего, в конечном итоге, сделать-то надо? Прокси сервер?
карма: 1

0
Ответов: 893
Рейтинг: 18
#9: 2008-05-14 18:58:37 ЛС | профиль | цитата
tsdima писал(а):
Тебе чего, в конечном итоге, сделать-то надо? Прокси сервер?


да именно прокси сервер ток не говори что есть компонент такой он мне не подходит так как он малофункционален.
карма: 0
Время верстки: %cr_time% Текущее время: %time%
0
Ответов: 2125
Рейтинг: 159
#10: 2008-05-14 22:51:38 ЛС | профиль | цитата
Вобщем, я незнаю, что у тебя там не так, но у меня вот эта схема:

Add(MainForm,9378122,35,84)
{
Left=20
Top=105
link(onCreate,11570887:##open,[])
}
Add(TCP_ServerEx,11570887,91,119)
{
}
BEGIN_SDK
Add(EditMultiEx,6799701,21,21)
{
WorkCount=#6:##open|
Width=433
Height=193
}
Add(TCP_Connection,10988943,84,77)
{
link(onRead,8949941:doSearch,[(138,83)(138,118)])
link(onConnect,3220803:doOpen,[])
link(onDisconnect,3220803:doClose,[])
}
Add(FormatStr,14521251,217,112)
{
DataCount=1
Mask="GET %1 HTTP/1.1
Host: hiasm.com

"
link(onFString,3220803:doSend,[(271,118)(271,104)])
}
Add(TCP_Client,3220803,294,84)
{
Port=80
IP="81.176.226.166"
link(onRead,10988943:doSend,[(350,90)(350,61)(63,61)(63,90)])
link(onDisconnect,4164401:doTimer,[])
}
Add(Timer,4164401,357,98)
{
Interval=1
Enable=1
AutoStop=1
link(onTimer,10988943:doClose,[(404,104)(404,157)(72,157)(72,83)])
}
Add(BlockFind,8949941,161,112)
{
IncludeBlock=1
StartBlock="GET "
EndBlock=" HTTP"
link(onSearch,14521251:doString,[])
}
END_SDK
работает на ура, открывая localhost вижу сайт HiAsm со всеми картинками.

------------ Дoбавленo:

Ты вообще в курсе, что TCP_Server подходит только для чата, и то не всегда?
Нормальный сервер работает с каждым клиентом по-отдельности, как TCP_ServerEx.
Браузер обычно открывает несколько соединений, чтобы грузить файлы/картинки/css, присутствующие на странице, параллельно.
В случае с TCP_Server браузер получит кашу из всего этого в каждом соединении.
карма: 1

1
Голосовали:Ghost_Russia
Ответов: 893
Рейтинг: 18
#11: 2008-05-15 14:28:33 ЛС | профиль | цитата
tsdima писал(а):
Ты вообще в курсе, что TCP_Server подходит только для чата, и то не всегда?

Конечно
Просто мне пришлось упростить схему для того чтоб был понятен смысл выполняемых действий для решения задачи.

Кстати , твоя схема не работает с рисунками , а то что у тебя загрузилось я подозреваю это был кеш.
Даже постле замены исходного кода TCPclient
карма: 0
Время верстки: %cr_time% Текущее время: %time%
0
Ответов: 893
Рейтинг: 18
#12: 2008-05-15 17:27:37 ЛС | профиль | цитата
В hiasm есть штатный пример WEB сервера в котором явно показано как файл передают браузеру предварительно отконвертировав в текст и добавив ему необходимые заголовки.

code_2225.txt

Так вот проделав все необходимые операции я так и не смог конвертировать файл принятый TCPclient в исходное состояние , поэтому я делаю предположение что TCPclient возвращает не тот результат который нужен.
карма: 0
Время верстки: %cr_time% Текущее время: %time%
0
файлы: 1code_2225.txt [752B] [219]
Ответов: 893
Рейтинг: 18
#13: 2008-05-15 17:37:20 ЛС | профиль | цитата
Есть предложение , почему бы нам не рассмотреть следующий вариант :
1. Принять ответ http сервера на TCPclient разбить его на две части 1заголовок 2данные
2. Далее часть 2 (данные) преобразовать обратно в файл .
Но я не смог выполнить пункт номер 2 поскольку незнаю как обработать эту часть данных таким образом чтоб превратить это в исходный файл отправляемый http сервером , кстати скорее всего браузер тоже попадает в тупик получая такие данные.
карма: 0
Время верстки: %cr_time% Текущее время: %time%
0
Ответов: 2125
Рейтинг: 159
#14: 2008-05-15 19:12:14 ЛС | профиль | цитата
Byuik писал(а):
В hiasm есть штатный пример WEB сервера в котором явно показано как файл передают браузеру предварительно отконвертировав в текст

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

Byuik писал(а):
1. Принять ответ http сервера на TCPclient разбить его на две части 1заголовок 2данные
2. Далее часть 2 (данные) преобразовать обратно в файл

Браузер справляется с этими задачами гораздо лучше.

Вообще-то, у меня своя реализация TCP.pas, но та версия, что вместе с Хиасмом идёт, тоже вроде нормально работала.
Я как-то публиковал тут свою версию, но тогда она была с ошибкой. Ты случайно не экспериментировал с ней?
На всякий случай, сравни свой TCP.pas с тем, что на SVN.

карма: 1

0
Ответов: 893
Рейтинг: 18
#15: 2008-05-16 02:44:30 ЛС | профиль | цитата
tsdima писал(а):
Ты случайно не экспериментировал с ней?

Нет

tsdima писал(а):
На всякий случай, сравни свой TCP.pas с тем, что на SVN


Один к одному

tsdima писал(а):
Браузер справляется с этими задачами гораздо лучше.


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

А я смею предположить что естли их вообще обработать нельзя никак кроме как текст то значит там повреждённые данные и повреждены TCPClient ом
карма: 0
Время верстки: %cr_time% Текущее время: %time%
0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)