Вверх ↑
Этот топик читают: Гость
Ответов: 1429
Рейтинг: 50
#61: 2011-06-05 23:36:27 ЛС | профиль | цитата
Еще раз проверил, теперь из 14 два оборвало.

И еще работает если сервер каждый раз присылает весь ответ, думаю, а что будет если сам сервер пришлет оборваное сообщение, а сразу за ним целое? Схема поймет, что это два разных сообщения?
------------ Дoбавленo в 23.36:
nesco писал(а):
Я никак не пойму, как она их обрывает

Если, например, записывать в список строк сырой ответ, без парсинга, то не обрывает.
карма: 0

0
Разработчик
Ответов: 26170
Рейтинг: 2127
#62: 2011-06-05 23:40:30 ЛС | профиль | цитата
login писал(а):
Схема поймет, что это два разных сообщения?

Там синхронизация стоит по заголовку

login писал(а):
Если, например, записывать в список строк сырой ответ, без парсинга, то не обрывает

Какой список строк, какой прасинг, я ничерта не могу понять
карма: 22

0
Ответов: 1429
Рейтинг: 50
#63: 2011-06-05 23:43:01 ЛС | профиль | цитата
nesco, вот смотрите, это один ответ сервера записаный в лог. Каждая цифра это событие на точке TCP_Client, с порцией данных:

log_1otvet.rar
------------ Дoбавленo в 23.43:
"без пасинга" я имел ввиду без обработки, просто сохранять на диск.
карма: 0

0
файлы: 1log_1otvet.rar [14.5KB] [90]
Разработчик
Ответов: 26170
Рейтинг: 2127
#64: 2011-06-06 00:24:31 ЛС | профиль | цитата
Я до сих пор еще одного не пойму -- а как ты их сравниваешь, откуда известно, что в конечных сращенных данных чего-то не хватает
карма: 22

0
Ответов: 1429
Рейтинг: 50
#65: 2011-06-06 00:35:58 ЛС | профиль | цитата
XML должен заканчиваться тегом </feed>, то его корневой блок. Кроме того я сравниваю конец XML-ля в снифере и в hiasm.
------------ Дoбавленo в 00.31:
Снифер, почему-то никогда не ошибается.
------------ Дoбавленo в 00.34:
nesco, с момощью костылей я получил 100% рабочую схему. отработало 50 из 50-ти без ошибок. Щас скину.


------------ Дoбавленo в 00.35:
Добавил "избыточную" кешируемость:


Add(MultiElementEx,15245682,252,168)
{
@Hint=#27:Получить XML по всем видео!|
@Color=43690
AddHint(-72,-71,167,13,@Hint)
}
BEGIN_SDK
Add(EditMultiEx,800280,21,21)
{
WorkCount=#8:doString|
EventCount=#15:onLength1=onEnd|0:|
Width=1679
Height=767
link(doString,6872508:doString,[(45,27)(45,146)])
}
Add(Hub,12509480,539,140)
{
OutCount=7
link(onEvent2,15958911:In,[(572,153)(572,125)])
link(onEvent3,8022212:doWork2,[(740,160)(740,132)])
link(onEvent4,1560143:doStop,[(626,167)(626,230)])
link(onEvent6,8281024:doOpen,[])
link(onEvent7,8281024:doSend,[(567,188)(567,195)])
}
Add(TCP_Client,8281024,581,175)
{
Port=80
Point(onError)
PColor(onDisconnect,11184810)
link(onRead,169976:doEvent1,[])
link(IP,602540:Value,[(587,157)(417,157)(417,180)(384,180)])
link(Data,12434424:Var,[])
}
Add(Host,13992201,329,133)
{
link(onIPByHost,602540:doValue,[])
link(HostName,5590300:Value,[])
}
Add(Memory,5590300,336,91)
{
Default=String(gdata.youtube.com)
}
Add(Memory,602540,378,140)
{
Default=String(www.google.com)
link(onData,4228338:doData,[])
}
Add(GlobalVar,15729024,133,70)
{
Name="Auth"
}
Add(FormatStr,6872508,133,140)
{
DataCount=3
Mask="GET /feeds/api/users/default/uploads HTTP/1.1
Host: gdata.youtube.com
Content-Type: application/atom+xml
Authorization: GoogleLogin auth=%1
GData-Version: 2
X-GData-Client: %2
X-GData-Key: key=%3


"
Point(FString)
link(onFString,13992201:doIPByHost,[])
link(Str1,15729024:Var,[])
link(Str2,9080111:Var,[(146,116)(125,116)])
link(Str3,13209877:Var,[(153,117)(174,117)])
}
Add(LineBreak,16088136,133,182)
{
Caption="Data"
Type=1
link(Data,6872508:FString,[])
Primary=[12434424,455,-42]
}
Add(GlobalVar,9080111,119,49)
{
Name="name_program"
}
Add(GlobalVar,13209877,168,28)
{
Name="programmer_key"
}
Add(StrCat,8029442,770,119)
{
Point(doClear)
link(Str1,4232550:Var1,[(776,106)(814,106)(814,159)])
}
Add(StrCat,4049894,770,182)
{
Str2="
"
Point(doClear)
link(onStrCat,8548926:doEvent1,[])
link(Str1,4232550:Var2,[])
}
Add(Hub,8548926,812,182)
{
link(onEvent1,11742242:doEvent1,[])
link(onEvent2,8022212:doWork3,[(833,195)(833,220)(758,220)])
}
Add(GetDataEx,4232550,770,154)
{
link(Data,8029442:Result,[])
}
Add(Hub,169976,637,175)
{
link(onEvent1,8029442:doStrCat,[(667,181)(667,125)])
link(onEvent2,1560143:doSearch,[(668,188)(668,223)])
}
Add(LineBreak,6328839,700,189)
{
link(Out,4049894:doClear,[])
Primary=[15958911,-112,-70]
}
Add(HubEx,8022212,754,126)
{
link(onEvent,8029442:doClear,[])
}
Add(DoData,4228338,448,140)
{
Data=String()
link(onEventData,12509480:doEvent1,[])
}
Add(StrList,16481994,1386,182)
{
link(FileName,2401908:FString,[(1399,166)(1441,166)])
}
Add(Counter,12472518,1386,119)
{
link(onNext,2401908:doString,[])
}
Add(Hub,6106760,1323,182)
{
OutCount=4
link(onEvent1,12472518:doNext,[(1358,188)(1358,125)])
link(onEvent2,16481994:doClear,[])
link(onEvent3,16481994:doText,[(1361,202)(1361,209)])
link(onEvent4,16481994:doSave,[(1354,209)(1354,223)])
}
Add(FormatStr,2401908,1435,119)
{
Mask="C:\log\%1.txt"
Point(FString)
}
Add(MultiElementEx,11156933,1106,182)
{
@Hint=#23:Декодер цепочных блоков|
link(onOutput,9509036:doEvent1,[])
link(onNotChunk,15412616:doWork2,[(1162,195)(1162,335)])
link(onEvent3,6570675:doWork1,[(1147,202)(1147,257)(947,257)])
link(Data,1853942:Value,[(1112,170)(1038,170)(1038,227)(1000,227)])
AddHint(60,-52,150,13,@Hint)
}
BEGIN_SDK
Add(EditMultiEx,9218302,21,21)
{
WorkCount=#5:Input|7:PopData|
EventCount=#8:onOutput|10:onNotChunk|8:onEvent3|
DataCount=#4:Data|
Width=1287
Height=494
VOffset=343
HOffset=91
link(Input,1716261:doAdd,[(43,370)(43,265)])
link(PopData,3547378:doData,[])
}
Add(Hub,5160054,1057,364)
{
OutCount=3
link(onEvent1,8505099:doData,[])
link(onEvent2,8101622:doReset,[(1089,377)(1089,426)(374,426)(374,237)])
link(onEvent3,9218302:onEvent3,[])
}
Add(BlockFind,13296706,266,266)
{
@Hint=#15:Поиск заголовка|
@Color=9360639
Delete=0
StartBlock="HTTP"
EndBlock="13101310"
link(onSearch,13542008:doSearch,[(306,272)(306,146)])
link(onEndSearch,1835341:doEvent,[])
AddHint(-8,-52,103,13,@Hint)
}
Add(InfoTip,10771330,245,56)
{
Info=#30:Блок обработки цепочных блоков|
Font=[MS Sans Serif,8,1,0,1]
Frame=3
Width=1037
Height=424
Margin=10
}
Add(DataToFile,405781,735,280)
{
@Hint=#30:Считываем длину текущего блока|
Type=7
link(onGet,13148707:doEvent1,[])
link(Stream,2242998:Var2,[])
AddHint(-56,57,188,13,@Hint)
}
Add(MemoryStream,15414165,553,147)
{
@Hint=#25:Главный накопитель потока|
Point(doPosition)
Point(Position)
AddHint(-143,-32,159,13,@Hint)
}
Add(IndexToChanel,1835341,406,273)
{
@Hint=#18:Коммутатор потоков|
Point(Index)
link(onEvent2,3620042:doReplace,[])
link(Index,8101622:State,[])
AddHint(52,-29,121,13,@Hint)
}
Add(Hub,15047654,371,140)
{
OutCount=4
link(onEvent1,14672193:doClear,[(395,146)(395,107)(1204,107)(1204,307)])
link(onEvent2,280953:doClear,[(525,153)(525,146)])
link(onEvent3,15414165:doClear,[])
link(onEvent4,8101622:doOn,[(395,167)(395,244)])
}
Add(Switch,8101622,406,224)
{
@Hint=#128:Переключатель коммутатора потоков. Если поймали начало нового цикла, то переключаемся на накопление и обработку потоковых данных|
DataOn=Integer(1)
DataOff=Integer(0)
Point(State)
Point(doOn)
AddHint(-153,90,198,65,@Hint)
}
Add(Convertor,4846764,819,287)
{
@Hint=#34:Переводим длину блока из HEX в DEC|
Mode=5
link(onResult,13652235:doValue,[])
AddHint(-69,-56,190,26,@Hint)
}
Add(StreamCopy,2003248,553,280)
{
@Color=9360639
Count=-1
link(onCopy,10493831:doEvent1,[])
link(Dest,15562255:Var2,[])
}
Add(Hub,10493831,609,280)
{
InCount=2
OutCount=3
link(onEvent1,9519320:doData,[(641,286)(641,251)])
link(onEvent2,405781:doGet,[])
link(onEvent3,5192092:doData,[])
}
Add(GetDataEx,15562255,553,217)
{
link(Data,15414165:Stream,[])
}
Add(DoData,9519320,672,245)
{
@Hint=#66:Перемещаем указатель в главном накопителе на начало текущего блока|
Data=Integer(0)
link(onEventData,14363307:doWork2,[])
link(Data,280953:Value,[])
AddHint(-232,-53,197,26,@Hint)
}
Add(Memory,280953,672,133)
{
@Hint=#41:Хранилище указателя начала текущего блока|
Default=Integer(0)
Point(Data)
link(Data,15414165:Position,[(678,121)(626,121)(626,191)(573,191)])
AddHint(-210,-64,169,26,@Hint)
}
Add(Hub,13148707,784,280)
{
link(onEvent1,3613939:doClear,[(811,286)(811,160)])
link(onEvent2,4846764:doConvert,[])
}
Add(Memory,13652235,861,287)
{
link(onData,13903680:doCompare,[])
}
Add(StreamCopy,2674035,959,287)
{
@Color=9360639
Count=-1
link(onCopy,2723286:doCompare,[])
link(Dest,13521530:Var2,[])
link(Source,9628397:Var2,[])
link(Count,16364596:Var2,[])
}
Add(MemoryStream,3613939,959,147)
{
@Hint=#20:Буфер текущего блока|
Point(doPosition)
Point(Position)
AddHint(71,-24,131,13,@Hint)
}
Add(GetDataEx,2242998,735,217)
{
Angle=3
link(Data,15562255:Var3,[])
}
Add(If_else,2723286,1008,287)
{
@Hint=#144:Если считанная длина блока не равна нужной, то ждем следующих данных. Если равна, то переходим к накоплению текста и переходу к следующему блоку|
link(onTrue,16326683:doEvent1,[])
link(Op1,16364596:Var3,[(1014,271)])
AddHint(63,-138,188,65,@Hint)
}
Add(Hub,16326683,1057,287)
{
OutCount=5
link(onEvent1,405418:doData,[(1089,293)(1089,201)(889,201)(889,167)])
link(onEvent2,11205451:doConvert,[])
link(onEvent3,4428523:doGet,[(1106,307)(1106,335)])
link(onEvent4,280953:doValue,[(1098,314)(1098,114)(660,114)(660,139)])
link(onEvent5,10493831:doEvent2,[(1089,321)(1089,359)(594,359)(594,293)])
}
Add(DoData,405418,903,161)
{
@Hint=#44:Перемещаем указатель буфера на начало данных|
Data=Integer(0)
link(onEventData,3613939:doPosition,[])
AddHint(35,-89,197,26,@Hint)
}
Add(GetDataEx,13521530,959,182)
{
link(Data,3613939:Stream,[])
}
Add(DoData,5192092,651,294)
{
@Hint=#89:Возвращаем указатель в конец главного накопителя, для возможности добавления новых данных|
Data=Integer(0)
link(onEventData,14363307:doWork3,[(718,300)])
link(Data,15414165:Size,[(657,203)(566,203)])
AddHint(-166,72,181,52,@Hint)
}
Add(HubEx,14363307,714,245)
{
Angle=3
link(onEvent,15414165:doPosition,[(718,208)(541,208)(541,167)])
}
Add(DataToFile,4428523,1120,322)
{
@Hint=#174:В конце каждого блока есть перевод строки, который не попадает в счетчик. Перемещаем указатель за него к началу следующего блока. После чего, сохраняем указатель в хранилище |
Type=7
link(Stream,9628397:Var3,[(1126,222)])
AddHint(-213,63,197,78,@Hint)
}
Add(GetDataEx,9628397,966,217)
{
Angle=3
link(Data,2242998:Var3,[])
}
Add(Replace,3620042,455,280)
{
@Hint=#60:Приводим к UNIX-формату перевода строк, оставляем только #13|
SubStr="10"
link(onReplace,7706637:doConvert,[])
AddHint(-183,146,182,39,@Hint)
}
Add(If_else,13903680,903,287)
{
@Hint=#66:Если длина блока равна нулю, то заканчиваем операцию чтения блоков|
Type=5
Op2=Integer(0)
link(onTrue,2674035:doCopy,[])
link(onFalse,5160054:doEvent1,[(947,300)(947,370)])
AddHint(-208,78,196,26,@Hint)
}
Add(StrCat,14672193,1218,294)
{
@Hint=#20:Строковый накопитель|
Point(doClear)
link(Str1,1249226:Var3,[(1224,282)(1261,282)(1261,341)])
AddHint(-114,-53,133,13,@Hint)
}
Add(GetDataEx,1249226,1218,336)
{
link(Data,14672193:Result,[])
}
Add(DoData,8505099,1218,364)
{
@Hint=#22:Перенаправление данных|
link(onEventData,9218302:onOutput,[])
link(Data,1249226:Var2,[])
AddHint(-102,69,147,13,@Hint)
}
Add(GetDataEx,16364596,973,266)
{
Angle=3
link(Data,13652235:Value,[(922,271)(922,331)(867,331)])
}
Add(BlockFind,13542008,315,140)
{
@Hint=#36:Поиск режима Chunked передачи данных|
@Color=9360639
Delete=0
StartBlock="Transfer-Encoding:"
EndBlock="chunked"
Point(onNotFind)
link(onSearch,15047654:doEvent1,[])
link(onNotFind,9218302:onNotChunk,[(361,160)(361,454)(1289,454)(1289,377)])
AddHint(-62,-71,189,26,@Hint)
}
Add(Convertor,7706637,504,280)
{
@Hint=#22:Преобразователь данных|
Mode=12
link(onResult,2003248:doCopy,[])
AddHint(-26,58,146,13,@Hint)
}
Add(Convertor,11205451,1162,294)
{
@Hint=#22:Преобразователь данных|
Mode=11
link(onResult,14672193:doStrCat,[])
link(Data,13521530:Var3,[(1168,187)])
AddHint(-122,-34,146,13,@Hint)
}
Add(StrList,1716261,112,259)
{
Point(doGetString)
Point(onGetString)
link(Str,9218302:Data,[])
link(onGetString,1039286:doCase,[])
}
Add(DoData,12591004,63,273)
{
Data=Integer(0)
link(onEventData,1716261:doDelete,[])
}
Add(DoData,3547378,63,371)
{
Data=Integer(0)
link(onEventData,1716261:doGetString,[(103,377)(103,307)])
}
Add(Case,1039286,154,266)
{
Value=String()
link(onNextCase,8738286:doEvent1,[])
}
Add(Hub,8738286,196,266)
{
link(onEvent1,13296706:doSearch,[])
link(onEvent2,12591004:doData,[(221,279)(221,230)(52,230)(52,279)])
}
Add(InfoTip,8154874,28,56)
{
Info=#14:Очередь данных|
Font=[MS Sans Serif,8,1,0,1]
Frame=3
Width=211
Height=424
Margin=10
}
END_SDK
Add(Memory,1853942,994,182)
{
link(onData,11695545:doSafeMode,[])
}
Add(SafeMode,11695545,1050,182)
{
link(onSafeMode,11156933:Input,[])
}
Add(Hub,9509036,1190,182)
{
link(onEvent1,6106760:doEvent1,[])
link(onEvent2,15412616:doWork1,[(1222,195)])
}
Add(Thread,15450140,1001,364)
{
Delay=25
link(onExec,9777364:doSafeMode,[])
link(onSyncExec,11976633:doEvent,[])
}
Add(SafeMode,9777364,1057,364)
{
link(onSafeMode,11156933:PopData,[(1098,370)(1098,195)])
}
Add(Hub,15289855,959,322)
{
link(onEvent1,1566672:doReset,[])
link(onEvent2,15450140:doStart,[(987,335)(987,370)])
}
Add(IndexToChanel,11976633,1246,371)
{
@Hint=#25:Коммутатор синхроимпульса|
Point(Index)
link(onEvent2,15450140:doStop,[(1290,384)(1290,416)(987,416)(987,377)])
link(Index,1566672:State,[])
AddHint(-187,51,164,13,@Hint)
}
Add(Switch,1566672,1246,315)
{
@Hint=#28:Переключатель синхроимпульса|
DataOn=Integer(1)
DataOff=Integer(0)
Point(State)
Point(doOn)
AddHint(-229,-22,182,13,@Hint)
}
Add(HubEx,15412616,1218,329)
{
link(onEvent,1566672:doOn,[])
}
Add(BlockFind,6687860,896,322)
{
@Hint=#15:Поиск заголовка|
@Color=9360639
Delete=0
StartBlock="HTTP"
EndBlock="13101310"
link(onSearch,6570675:doWork2,[])
AddHint(-8,-52,103,13,@Hint)
}
Add(HubEx,6570675,943,322)
{
link(onEvent,15289855:doEvent1,[])
}
Add(Hub,11742242,840,182)
{
link(onEvent1,1853942:doValue,[])
link(onEvent2,6687860:doSearch,[(878,195)(878,328)])
}
Add(BlockFind,1560143,700,217)
{
IncludeBlock=1
StartBlock="</entry>"
EndBlock="</feed>"
Point(doStop)
link(onSearch,4049894:doStrCat,[(741,223)(741,188)])
}
END_SDK



Но не понимаю зачем ему это надо.
------------
чуть исправил схему, лучше цеплаться за конец XML-ля, тогда, вообще, верняк. Спасибо nesco, не знаю, шо б я без Вас делал!!!
карма: 0

0
Разработчик
Ответов: 26170
Рейтинг: 2127
#66: 2011-06-06 01:01:39 ЛС | профиль | цитата
login писал(а):
Но не понимаю зачем ему это надо

Как раз я сейчас и подумал над тем же самым, что ты примннил, те нужен был полный накопитель, а потом отдавать на сшивание

В твоей схеме лучше применить вчерашний модуль, без всяких потоков. Попробуй, должно получиться, гораздо проще будет
карма: 22

0
Ответов: 1429
Рейтинг: 50
#67: 2011-06-06 01:26:41 ЛС | профиль | цитата
оК!
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#68: 2011-06-06 10:42:48 ЛС | профиль | цитата
login, а так не пробовал ?
code_24313.txt
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
файлы: 1code_24313.txt [2.5KB] [159]
Ответов: 1429
Рейтинг: 50
#69: 2011-06-06 11:12:34 ЛС | профиль | цитата
Tad, я не совсем понял разницу. В поиске тега </feed> вроде небыло проблемы, чем это отличается от поиска с помощью элемента blockfind?
карма: 0

0
Разработчик
Ответов: 26170
Рейтинг: 2127
#70: 2011-06-06 11:56:59 ЛС | профиль | цитата
login писал(а):
чем это отличается от поиска с помощью элемента blockfind?

Да ничем, кроме скорости, и то, под вопросом. К сведению, BloсkFind также использует Pos
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#71: 2011-06-06 11:57:16 ЛС | профиль | цитата
login, чё тяжело подключить кнопку и попробовать?
1. Скорость.
2. Никаких "недокачаных" запросов
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26170
Рейтинг: 2127
#72: 2011-06-06 12:40:59 ЛС | профиль | цитата
login, мне так кажется, что схему декодера после накопителя можно упростить раза в два, если не больше
------------ Дoбавленo в 12.05:
Tad, а ты не подскажешь, где в твоей схеме декодер цепочных данных
------------ Дoбавленo в 12.06:
Tad писал(а):
Никаких "недокачаных" запросов

Недокаченных не будет, но вот несшитых аж целая куча -- где декодер чанков
------------ Дoбавленo в 12.07:
Tad писал(а):
Скорость

Какая к черту скрость на блок длиной до десяти килобайт максимум
Она дольше его передает, чем декодирует
------------ Дoбавленo в 12.40:
login, мне кажется, что окончательный вариант должен выглядеть вот так -- get_http_text_008.sha
карма: 22

0
файлы: 1get_http_text_008.sha [49.7KB] [150]
Ответов: 1429
Рейтинг: 50
#73: 2011-06-06 22:53:11 ЛС | профиль | цитата
nesco писал(а):
окончательный вариант
Да, работает идеально, 50 из 50-ти. Спасибо!
------------ Дoбавленo в 22.53:
Это покажется странным, но в реальной программе, приходится ставить очистку для StrCut:

Add(Hub,12509480,546,168)
{
OutCount=3
PColor(onEvent1,16711680)
link(onEvent1,16029939:doWork2,[(572,174)(572,132)])
link(onEvent2,8281024:doOpen,[])
link(onEvent3,8281024:doSend,[(570,188)(570,195)])
}
Add(TCP_Client,8281024,581,175)
{
Port=80
Point(onError)
PColor(onDisconnect,11184810)
link(onRead,169976:doEvent1,[])
link(Data,12434424:Var,[])
}
Add(LineBreak,16088136,133,210)
{
Caption="Data"
Type=1
Primary=[12434424,455,-70]
}
Add(StrCat,8029442,777,119)
{
Point(doClear)
link(Str1,4232550:Var1,[(783,106)(821,106)(821,159)])
}
Add(Hub,8548926,819,182)
{
link(onEvent2,16029939:doWork3,[(851,195)(851,220)(760,220)])
}
Add(GetDataEx,4232550,777,154)
{
link(Data,8029442:Result,[])
}
Add(Hub,169976,665,175)
{
link(onEvent1,8029442:doStrCat,[(696,181)(696,125)])
link(onEvent2,8327276:doSearch,[])
}
Add(DoData,4883273,777,182)
{
link(onEventData,8548926:doEvent1,[])
link(Data,4232550:Var2,[])
}
Add(Position,8327276,714,182)
{
Target="</feed>"
ShortSearch=1
link(onSearch,4883273:doData,[])
}
Add(HubEx,16029939,756,126)
{
PColor(onEvent,16711680)
link(onEvent,8029442:doClear,[])
}



Без этой очистки, иногда(раз в 20 ответов), на выходе из декодера, появляется пустое событие (Без данных) Как будто где-то остается кусочек предыдущего запроса. Но я еще не доконца уверен. Может я ошибаюсь, если у кого-то будет такая ошибка то попробуйте очистку.
карма: 0

0
Разработчик
Ответов: 26170
Рейтинг: 2127
#74: 2011-06-06 22:56:41 ЛС | профиль | цитата
login писал(а):
Без этой очистки

В принципе, не помешает
карма: 22

0
74
Сообщение
...
Прикрепленные файлы
(файлы не залиты)