Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.005 c
15-1245683991
Tornado
2009-06-22 19:19
2009.08.23
А можно ли...


2-1245923503
@!!ex
2009-06-25 13:51
2009.08.23
Как установить окну пустой курсор?


15-1245911928
desc
2009-06-25 10:38
2009.08.23
Не получается "слиять" два поля... Postgres


1-1211977078
TForumHelp
2008-05-28 16:17
2009.08.23
Создание компонента


15-1246001034
Василий Жогарев
2009-06-26 11:23
2009.08.23
PostgreSQL 8.3 and DataType serial





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский