Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.08.23;
Скачать: CL | DM;

Вниз

Скрин не передаётся по сети..   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.013 c
2-1245854213
Игорёк Ш.
2009-06-24 18:36
2009.08.23
Возможно ли такое? Или и нестоит заморачиваться?


6-1205792707
cerber
2008-03-18 01:25
2009.08.23
Twebbrowser and Newwindow


15-1245789024
Юрий
2009-06-24 00:30
2009.08.23
С днем рождения ! 24 июня 2009 среда


2-1245751544
vvrz
2009-06-23 14:05
2009.08.23
Как сохранить строку с двойным апострофом


3-1226375636
Grain
2008-11-11 06:53
2009.08.23
Проверка на блокировку записи