-
Здраствуйте, уважаемые форумчани.
Написала программульку которая делает на удаленной машине скриншот и передает его на мой. Но есть две проблемы:
1. При отображении изображения в image32 происходит какаето ерунда - такое ощущение, что по сети передается не одно изображение, а целая куча, причем с каждым разом все меньше и меньше их параметры(ширина и высота). В итоге в image32 сразу видно несколько, отличных по размеру, копий изображения.
2. Вторая проблема заключается в том, что не могу передать копию удаленного экрана во всем размере ,хотя и кодирую его в jpg. Приходиться передавать уменьшенную копию, к примеру 500 на 500. Можно и побольше, но качество надо уменьшить. Если передаю во весь размер Delphi выдает ошибку - переполнения буфера.
В работе использую компоненты indy для работы с udp. Помогите разобраться...
Может быть непонятно объяснила проблемы - поэтому прикрепляю два файла. Когда протестируете все увидите сами...
Заранее спасибо...
-
1. Выкинь UDP, а пользуй TCP 2. Прикрепленных файлов лично я не увидел :) Твоя проблема состоит в том, что UDP: вопервых не гарантирует доставку; вовторых имеет ограничение по размеру кадра чуть меньше 64Кб. Если даже будешь разбивать изображение на части то UDP не гарантирует, что посланная тобой последовательность придет в том же порядке как и посылалась!
Решение твоей задачи:
Первое 1. Используй TCP и будет Вам щастье :)
Второе 1. Не морочь голову поставь RAdmin :)
Если же выберешь первое решение, то есть компоненты T(Server/Client)Socket в [Delphi]\Source\VCL\SCKTCOMP.PAS ну или ИНДИ :) Смотря какая стоит задача. Можно и на Winsock-е написать :)
-
Оффтоп: Вы часом с ikot-ом не родственники? :)
-
> Написала программульку которая делает на удаленной машине > скриншот и передает его на мой. Но есть две проблемы:
Стянула код неизвестно откуда и ес-но в нем ничего не понимаю, поэтому есть две проблемы:
> 1. При отображении изображения в image32 происходит какаето > ерунда - такое ощущение, что по сети передается не одно > изображение, а целая куча, причем с каждым разом все меньше > и меньше их параметры(ширина и высота). В итоге в image32 > сразу видно несколько, отличных по размеру, копий изображения. >
Скорее всего передаются только изменившиеся куски скрина
> 2. Вторая проблема заключается в том, что не могу передать > копию удаленного экрана во всем размере ,хотя и кодирую > его в jpg. Приходиться передавать уменьшенную копию, к примеру > 500 на 500. Можно и побольше, но качество надо уменьшить. > Если передаю во весь размер Delphi выдает ошибку - переполнения > буфера.
У дельфи очень маленький буфер, туда целый экран не влезет ;)
> Может быть непонятно объяснила проблемы - поэтому прикрепляю > два файла. Когда протестируете все увидите сами...
Хм... тут совсем интересно. И куда их прикрепила? )))
-
> Оффтоп: Вы часом с ikot-ом не родственники? :)
C чего ты это взял. Если судить по твоим словам, то на этом форуме почти все являются родственниками.. Большая у нас тогда получается семья.
-
> > Написала программульку которая делает на удаленной машине > > скриншот и передает его на мой. Но есть две проблемы:Стянула > код неизвестно откуда и ес-но в нем ничего не понимаю, поэтому > есть две проблемы:> 1. При отображении изображения в image32 > происходит какаето > ерунда - такое ощущение, что по сети > передается не одно > изображение, а целая куча, причем с > каждым разом все меньше > и меньше их параметры(ширина и > высота). В итоге в image32 > сразу видно несколько, отличных > по размеру, копий изображения.> Скорее всего передаются > только изменившиеся куски скрина> 2. Вторая проблема заключается > в том, что не могу передать > копию удаленного экрана во > всем размере ,хотя и кодирую > его в jpg. Приходиться передавать > уменьшенную копию, к примеру > 500 на 500. Можно и побольше, > но качество надо уменьшить.> Если передаю во весь размер > Delphi выдает ошибку - переполнения > буфера. У дельфи очень > маленький буфер, туда целый экран не влезет ;)> Может быть > непонятно объяснила проблемы - поэтому прикрепляю > два > файла. Когда протестируете все увидите сами...Хм... тут > совсем интересно. И куда их прикрепила? )))
Зачем грубить. Вообще то форумы для того и служат, чтобы спросить совета.
RADMIN - это хорошо, но хочеться и самой попробовать создать что-то подобное.
На щет исходников - дело в том, что аналогичное сообщение оставила и на другом форуме. Как здесь прикреплять файлы не знаю, поэтому выставляю исходники в письменном виде. Смотри сообщение ниже:
-
Это сервер
unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ScktComp, Jpeg, ExtCtrls, IdBaseComponent, IdComponent, IdUDPBase, IdUDPClient;
type TForm1 = class(TForm) ServerSocket1: TServerSocket; IdUDPClient1: TIdUDPClient; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); procedure ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket); procedure ServerSocket1ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket); private { Private declarations } public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure ScreenShot; var bmp: TBitmap; DC: HDC; Canvas: TCanvas; MemStream : TMemoryStream; jpg: TJpegImage;
begin DC := GetDC(0); Bmp := TBitmap.Create; Bmp.PixelFormat:=pf16bit; Bmp.Width := Screen.Width; Bmp.Height := Screen.Height;
Canvas := TCanvas.Create; Canvas.Handle := DC;
Bmp.Canvas.CopyRect(Screen.DesktopRect, Canvas, Screen.DesktopRect);
jpg := TJpegImage.Create; jpg.Assign( bmp );
bmp.Width := 500 ; bmp.Height:= 500; bmp.Canvas.StretchDraw( bmp.Canvas.Cliprect, jpg );
jpg.Assign( bmp ); jpg.CompressionQuality:=45;
MemStream:= TMemoryStream.Create;
jpg.SaveToStream(MemStream);
form1.idUDPClient1.SendBuffer(MemStream.Memory^,MemStream.Size);
MemStream.Free; jpg.Free; bmp.Free; Canvas.Free; end;
procedure TForm1.FormCreate(Sender: TObject); begin serverSocket1.Active:=true;
end;
procedure TForm1.FormDestroy(Sender: TObject); begin ServerSocket1.Active:=false;
end;
procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); var reseiveText, reseiveText1, cmd:string; lockin:boolean; begin
reseiveText:=Socket.ReceiveText; reseiveText1:=reseiveText;
if length(reseiveText)<=6 then cmd:=reseiveText else begin reseiveText:=copy(reseiveText, 8, length(reseiveText)); cmd:=copy(reseiveText1, 1, 6); end;
if cmd = 'screen' then ScreenShot;
end;
procedure TForm1.ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket); begin form1.Caption:='Connected...'; form1.IdUDPClient1.Port:=4001; form1.IdUDPClient1.Host:=Socket.RemoteHost; form1.IdUDPClient1.Active:=true; end;
procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket); begin form1.Caption:='Disconnect...'; end;
end.
-
Это клиент
unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ScktComp,jpeg, Buttons, IdBaseComponent, IdComponent, IdUDPBase, IdUDPServer, IdSocketHandle, unit3;
type TForm1 = class(TForm) ClientSocket1: TClientSocket; Label1: TLabel; Label2: TLabel; port: TEdit; ip: TEdit; Button1: TButton; Button2: TButton; BitBtn8: TBitBtn; IdUDPServer1: TIdUDPServer; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket); procedure ClientSocket1Disconnect(Sender: TObject; Socket: TCustomWinSocket); procedure Button3Click(Sender: TObject); procedure BitBtn8Click(Sender: TObject); procedure IdUDPServer1UDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle); private
{ Private declarations } public { Public declarations } end;
var Form1: TForm1; MemoryStream : TMemoryStream;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); begin ClientSocket1.Port:=strtoint(port.Text); ClientSocket1.Address:=ip.Text; ClientSocket1.Active:=true; end;
procedure TForm1.Button2Click(Sender: TObject); begin ClientSocket1.Active:=false; end;
procedure TForm1.FormDestroy(Sender: TObject); begin ClientSocket1.Close; ClientSocket1.Active:=false; end;
procedure TForm1.ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket); begin form1.Caption:='Connected!'; end;
procedure TForm1.ClientSocket1Disconnect(Sender: TObject; Socket: TCustomWinSocket); begin form1.Caption:='Disconnect'; end;
procedure TForm1.Button3Click(Sender: TObject); begin ClientSocket1.Socket.SendText('screen'); end;
procedure TForm1.BitBtn8Click(Sender: TObject); begin ClientSocket1.Socket.SendText('screen'); form3.show; end;
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle); begin MemoryStream:= TMemoryStream.Create; MemoryStream.CopyFrom(AData, AData.Size); MemoryStream.SaveToFile('C:\logo.jpg'); form3.Image321.Bitmap.LoadFromFile('C:\logo.jpg'); if form3.Showing then begin MemoryStream.Free; ClientSocket1.Socket.SendText('screen'); end; end; end.
-
> olchick © (03.06.09 11:39) [5] > Зачем грубить.
Увольтес, где???
-
Но есть две проблемы: Стянула код неизвестно откуда и ес-но в нем ничего не понимаю, поэтому > есть две проблемы: 1. При отображении изображения в image32 > происходит какаето > ерунда - такое ощущение, что по сети > передается не одно > изображение, а целая куча, причем с > каждым разом все меньше > и меньше их параметры(ширина и > высота). В итоге в image32 > сразу видно несколько, отличных > по размеру, копий изображения.> Скорее всего передаются > только изменившиеся куски скрина> 2. Вторая проблема заключается > в том, что не могу передать > копию удаленного экрана во > всем размере ,хотя и кодирую > его в jpg. Приходиться передавать > уменьшенную копию, к примеру > 500 на 500. Можно и побольше, > но качество надо уменьшить.> Если передаю во весь размер > Delphi выдает ошибку - переполнения > буфера. У дельфи очень > маленький буфер, туда целый экран не влезет ;)> Может быть > непонятно объяснила проблемы - поэтому прикрепляю > два > файла. Когда протестируете все увидите сами...Хм... тут > совсем интересно. И куда их прикрепила? )))
Вы тоже удовольтесь и прочитайте сами свои слова
-
> Вы тоже удовольтесь и прочитайте сами свои слова
И где тут груботсь? Изволите утверждать что он самолично написан?
-
> И где тут груботсь? Изволите утверждать что он самолично > написан?
никто не говорит об этом, а если Вы не понимаете о чем кокретно иде речь, то прошу Вас обратить внимание на эту фразу: ес-но в нем ничего не понимаю
Ладно, проехали...
-
> Ладно, проехали...
Проехали, так проехали...
1. Зачем серверу форма?
-
>olchick © Судя по исходнику, это полный бред! Зачем ты создаешь ClientSocket и ServerSocket если все равно посылаеш через UDP!?!?!?!?!?!?! Да этот форум отличается тем, чтобы давать направление куда копать! http://book.itep.ru -там найдешь описание UDP и TCP! твоя задача: 1. Создать "Запись" типа: Индентификатор+Команда+РазмерПередаваемыхДанных; 2. Сервер обрабатыевает команду и отсылает ответ на клиент. 3. TCP - это потоковый протокол, данные надо складывать в буфер, UDP - диаграммный протокол, и тебе он не подходит! 4. Выкинь свой исходник и начни изучать как устроены протоколы передачи данных, чтобы не задавать вопросов, почему у меня вышеописанный бред не работает.
-
> Зачем ты создаешь ClientSocket и ServerSocket если все равно > посылаеш через UDP!?!?!?!?!?!?!
А через него она передает адрес клиента, на этом его миссия заканчивается...
-
Всем БОЛЬШОЕ СПАСИБО за помощь ...
-
Было приятно советоваться с вами - дЖЕНТЕЛЬМЕНЫ
-
>olchick ©
А как ты проверяешь, послала ли ты данные или нет? У тебя нет обработки ошибок!
Чтобы ты поняла опишу технологию, как должна была бы выглядеть твоя программа:
1. Программа на удаленном ПК открывает УДП порт к примеру 8888 и слушает когда придет пакет от сервера. 2. Ты запуская свою программу администрирования отсылаешь Броадкаст пакет(можно раз в 15 сек) с данными своего (ДНС-Имени или IP-адрес)+Порт на свой ТСП сервер. 3. Клиент принимая пакет пытается соединится с твоим сервером. А далее ты создаешь список клиентов и далее уже отсылаеш и принимаеш данные по ТСП протоколу. А там нужно отделять одно сообщение(изображение) пакет от другого. 4. Дальше делаеш с данными все что тебе заблагорассудиться...
А передача команд строковыми переменными, большая расточительность. ИМХО!
-
[15] Вот, :( обиделась.... потом через 7 минут зашла [16] - ничего нет... и опять обиделась...
-
ну чего обижаться... Мы же объясняли, что не тот протокол... Или девушка ждала исходный программы ее мечты? пускай напишет, что она хотела...
|