Форум: "Прочее";
Текущий архив: 2009.08.23;
Скачать: [xml.tar.bz2];
ВнизСкрин не передаётся по сети.. Найти похожие ветки
← →
Knight © (2009-06-26 12:23) [0]Такой "глюк"... клиент-сервер, сервер делает снимок с окна программы и передаёт клиенту, тот грузит его в Имидж. Так вот, если клиент и сервер на одном компе (127.0.0.1), то всё работает, если на разных, то имидж остаётся пустым (один раз где-то один кадр проскочил и опять ничего). Мож кто встречал такой "дурдом"? (TServerSocket-TClientSocket-BDS2006)
← →
DVM © (2009-06-26 12:29) [1]в 17 строке там ошибка
← →
Сергей М. © (2009-06-26 12:29) [2]Это не дурдом.
Это непонимание логики работы упомянутых компонентов.
← →
Knight © (2009-06-26 13:16) [3]
> [1] DVM © (26.06.09 12:29)
> в 17 строке там ошибка
Флудеры :)
> [2] Сергей М. © (26.06.09 12:29)
> Это непонимание логики работы упомянутых компонентов.
Срисовал всё с примеров, на локале всё работает, по сети стрим не идёт... в чём может быть причина?
Отсылка идёт так... лишнее порезал.procedure Tfrm_Main.SendMapToClient(Sender: TObject);
var
Bitmap:TBitmap;
M:TMemoryStream;
i:Integer;
begin
...
Bitmap:=TBitmap.Create;
try
Bitmap:=...GetFormImage;
M:=TMemoryStream.Create;
try
Bitmap.SaveToStream(M);
M.Position:=0;
Socket.SendText(":DATASIZE:"+IntToStr(M.Size)+"#");
Socket.SendStream(M);
except
M.Free;
end;
finally
Bitmap.Free;
end;
end;
Приём так...procedure TForm2.ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket);
begin
Buff:=Buff+Socket.ReceiveText;
if Pos(":DATASIZE:",Buff)=1 then begin
Delete(Buff,1,10);
BuffSize:= StrToInt(Copy(Buff,1,Pos("#",Buff)-1));
Delete(Buff, 1, Pos("#",Buff));
BuffData:= TMemoryStream.Create;
end;
if (Length(Buff)=0) or (BuffSize=0) then exit;
BuffData.Write(Buff[1], length(Buff));
Delete(Buff,1,Length(Buff));
if BuffData.Size = BuffSize then begin
BuffData.Position:= 0;
Image1.Picture.Bitmap.LoadFromStream(BuffData);
BuffData.Free;
BuffSize:= 0;
end;
end;
← →
Сергей М. © (2009-06-26 13:23) [4]
> стрим не идёт
Так прямо и говорит - "не иду" ?
И отладчик молчит как партизан на допросе ?)
← →
Knight © (2009-06-26 13:25) [5]Ошибок нет...
← →
Knight © (2009-06-26 13:26) [6]Просто на локале в имидже скрин есть, а по сети нет.
← →
Сергей М. © (2009-06-26 13:35) [7]
> а по сети нет.
Да, печальный случай ..
А про отладчик ты конечно же в 1-й раз слышишь..
← →
DVM © (2009-06-26 13:37) [8]
> Knight ©
> Buff:=Buff+Socket.ReceiveText;
Т.е. ты передаешь в одном потоке и текстовые данные и бинарные, а первую порцию данных ты все равно клеишь в текстовый буфер, а тем не менее навреняка часть бинарных данных приклеиваются к текстовому заголовку, ты это не учитываешь? Вообще так не правильно, если уж мешаешь бинарные и текстовые данные то принимай не в строку а буфер в памяти, а потом ищи там свой заголовок.
← →
Knight © (2009-06-26 13:46) [9]
> [8] DVM © (26.06.09 13:37)
Почему не учитываю? Размер отрезается, остальное идёт во входящий буфер, как только размер приятых данных становится равен размеру в заголовке, то буфер закидывается в имидж и освобождается.
← →
Сергей М. © (2009-06-26 13:49) [10]
> Размер отрезается, остальное идёт во входящий буфер
Это тебе отладчик сказал ?)
← →
Knight © (2009-06-26 13:55) [11]
> [10] Сергей М. © (26.06.09 13:49)
Да.. проверено.
← →
DVM © (2009-06-26 13:56) [12]
> Knight © (26.06.09 13:46) [9]
> Почему не учитываю?
Потому что как только ты с принятыми данными сделаешь операцию сложения как со строками, часть бинарных данных за символом #0, (который в бинарных данных не редкость) скорее всего будет потеряна.
← →
DVM © (2009-06-26 13:57) [13]вот эта строка Buff:=Buff+Socket.ReceiveText; принимает первую порцию данных, представляющих коктейль из текстовых и бинарных и отсекает бинаруню часть (или усекает ее)
← →
Knight © (2009-06-26 14:06) [14]Нащупал такой "глюк"... на компе где клиент перешёл в другое окно, а потом вернуться в клиента, но промахнулся мимо заголовка и попал по имиджу, тот обновился и показал то, что было загружено с сервера... никакие другие способы перехода на клиента (заголовок, альтаб и прочее) такого действия не возымели :)
Что странно, на локальной машине проблем с перерисовкой нет :(
← →
DVM © (2009-06-26 14:08) [15]
> Нащупал такой "глюк"... на компе где клиент перешёл в другое
> окно, а потом вернуться в клиента, но промахнулся мимо заголовка
> и попал по имиджу
Ты еще с бубном попляши.
Я тебе объяснил в чем дело скорее всего. Если не хочешь разбираться, то возьми HTTP - в нем есть и заголовки с размером и бинарные данные он передает (те же картинки) и компоненты TIdHTTPServer и TIDHTTP клиент.
← →
Сергей М. © (2009-06-26 14:14) [16]
> Knight © (26.06.09 13:55) [11]
Не верю)
К тому же даже если "это" заработает у тебя при одних сетевых условиях, при других сетевых услловиях работать не обязано)
← →
DVM © (2009-06-26 14:26) [17]
> Knight ©
К тому же, почему ты решил, что сразу в первой порции пришедших данных будет вся картинка, она на кучу срабатываний ClientSocketRead может оказаться разнесена. Вероятно на это тебе намекает Сергей М.
Все порции надо собирать в отдельный буфер, после принятия очередной порции искать там заголовок, причем искать придется явно не строковыми функциями.
← →
Lamer@fools.ua © (2009-06-26 14:30) [18]>>Knight © (26.06.09 12:23)
Може это http://tinyurl.com/nfom5d поможет?
← →
Lamer@fools.ua © (2009-06-26 14:30) [19]>>Knight © (26.06.09 12:23)
Може это http://tinyurl.com/nfom5d поможет?
← →
Knight © (2009-06-26 14:31) [20]
> [17] DVM © (26.06.09 14:26)
>
> > Knight ©
>
> К тому же, почему ты решил, что сразу в первой порции пришедших
> данных будет вся картинка
А если код внимательно посмотреть?)
← →
Lamer@fools.ua © (2009-06-26 14:33) [21]А-а-а... web.archive.org zip-файлы не сохранил.
Но Гуглом нашёл вот это: http://code.progler.ru/view/25 :-)
← →
Сергей М. © (2009-06-26 14:53) [22]
> Knight © (26.06.09 14:31) [20]
Да как ни смотри - код кривой)
Пусть твой передатчик послал строкуDATASIZE: 1024#
Пусть при первом же событии OnRead приемником получена строкаDATASIZE: 102
Далее ты отрезаешь префикс (абсолютно дурацкий, ибо приемнику он нафих не нужен - приемник и так знает. что сейчас перелдатчик будет передавать размер стрима, а не что-то иное)
После кастрации остается102
Следом же в оставшемся хвосте ты ищешь символ#
, которого там нет.
А раз его там нет, то Copy() вернет пустую строку.
Эту пустую строку ты тут же пытаешься трактовать ф-цией StrToInt() как ц/численное значение.
И получаешь большущими граблями по лбу)
← →
Сергей М. © (2009-06-26 15:02) [23]
> Knight
Ты не поверишь - черенок у этих граблей так отшлифован лбами наступивших на них до тебя (т.е. бездумно содравших откуда-то этот самый код), что прямо-таки блестят на солнышке
)
← →
Knight © (2009-06-26 15:07) [24]
> [22] Сергей М. © (26.06.09 14:53)
А я и не говорил, что код супер-пупер :)
Это проба реализации идеи, которая будет использоваться в другой проеге (идея не в том как передаётся, а что передаётся и оно в общем-то работает :)
Код не идеален - это минус, но я поправлю - это плюс %)
Спасбо всем :)
← →
Knight © (2009-06-26 15:10) [25][23] Сергей М. © (26.06.09 15:02)
Там где я содрал было несколько иначе... но не суть важно... идею я проверил, теперь можно поднять более серьёзную литературу и переделать так, как НАДО :)
← →
DVM © (2009-06-26 15:15) [26]
> Knight ©
Может все таки HTTP взять? И протокол распространенный и компоненты есть готовые. А передать по нему можно все что угодно.
← →
Knight © (2009-06-26 15:20) [27]
> [26] DVM © (26.06.09 15:15)
"Орешек знанья тверд, но все же мы не привыкли отступать, нам расколоть его поможет"... Форум, книги, инет, faq :)
← →
DVM © (2009-06-26 15:22) [28]
> Knight ©
Я к тому, что он может оказаться удобнее на практике, т.к. всякие прокси ему не помеха (т.к. именно на него они и рассчитаны), а вот для самопальных протоколов они часто становятся непреодолимой преградой. Н у и куча других нюансов есть.
← →
Knight © (2009-06-26 15:29) [29]
> [28] DVM © (26.06.09 15:22)
У меня прокси нет... прога для локалки.
← →
DVM © (2009-06-26 15:35) [30]
> Knight ©
Ясно, тогда вывод по твоему вопросу такой:
1) Порции, которыми приходят данные в общем случае могут быть любыми.
2) Текстовые данные и бинарные нельзя принимать в строку.
3) Поиск подстроки в буфере, содержащем одновременно и текстовые и бинарные данные нельзя производить строковыми функциями.
← →
Вариант (2009-06-26 15:45) [31]
> DVM © (26.06.09 15:35) [30]
> 2) Текстовые данные и бинарные нельзя принимать в строку.
>
Отчасти концептуально согласен, но в делфи тип строка особый тип, который позволяет делать s1:="12345"+#0#1#4+"abds". По крайней мере в версиях 5 и 6 дельфи:-) То же относится и к 3) - работает PosPos(#1#4,s1).
А если есть вкусности, то их так и тянет использовать:-). Чего не стал бы делать в С++ билдер например.
← →
DVM © (2009-06-26 16:09) [32]
> но в делфи тип строка особый тип, который позволяет делать
> s1:="12345"+#0#1#4+"abds".
Позволяет, но лучше не искушать судьбу. Опять же размер Char не обязательно равен 1 байту.
← →
Вриант (2009-06-26 16:19) [33]
> DVM © (26.06.09 16:09) [32]
> Позволяет, но лучше не искушать судьбу. Опять же размер
> Char не обязательно равен 1 байту
.
Потому и указал про версию дельфи:-) А в общем концептуально согласен
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2009.08.23;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.006 c