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

Вниз

Рисунок через сокет   Найти похожие ветки 

 
Romm ©   (2007-04-15 11:30) [0]

******************************************************************************** **********************************
Я как-то говорил о этой проблеме, но решил повториться, т.к. мне никто не дал вразумительного ответа.
Подскажите пожалуйста как с сервера передать клиенту снимок рабочего стола, не сохраняя его на харде?
Спасиб


 
homm ©   (2007-04-15 11:52) [1]

> *************************************************************************
> ******* **********************************

Что ЭТО?


 
Virgo_Style ©   (2007-04-15 11:57) [2]

Romm ©   (15.04.07 11:30)
Подскажите пожалуйста как с сервера передать клиенту снимок рабочего стола, не сохраняя его на харде?


Самурай без меча подобен самураю с мечом - но без меча.
Аналогично, передать снимок, не сохраняя его на харде, можно так же, как и сохраняя - но не сохраняя.


 
Romm ©   (2007-04-15 12:14) [3]


> Что ЭТО?

пароль :)


> Virgo_Style ©   (15.04.07 11:57) [2]

ясно, но непонятно :)

Может я что-то не понимаю, но! программа должна передавать, для начала, снимков 10 в секунду. Представь, что запрос приходит на машину с 50Мб памяти, какая же будет производительность?А вот если снимочек сделать-тут же передать и освободить память...Да кому я обьясняю-то? Вы и так все понимаете. Короч, хорош глумиться, совет лучше дайте :))


 
MikePetrichenko ©   (2007-04-15 12:29) [4]

Hm..

800х600х8bit (самое хреновое граф разрешение и передача цвета) = 3Mb

Т. е. вы собираетеся за секунду передать 30 мегабайт на машину (с машины) с 50 мегабайтами памяти....

Начните с оптимизации.


 
Romm ©   (2007-04-15 12:35) [5]


> MikePetrichenko ©   (15.04.07 12:29) [4]

ну про машину с 50 Мб - это просто пример, но все же. Локальная сеть. Вообще это теория про снимки моя, поэтому может из нее не выйдет ничего. Но вот, что как-то можно просматривать действия, совершаемые на удаленной машине я знаю. Это мне и нужно. Если есть теории лучше, чем 10 снимков/сек - предложите плиз.

PS. Видел я прогу которая штампует до 10000 экземпляров/сек - как работает не знаю, но факт.


 
проходивший мимо   (2007-04-15 15:32) [6]

делаешь каким-то умным способом снимок с экрана (мой способ 1 снимок делает около 1-1,5 секунд)
сохраняешь его, например в
BitMap:TBitmap;
Str:TStream;


на севере:
Bitmap сохраняешь в Str
Socket.SendStream(str) //в названии этой функции "SendStream" могу ошибиться


на клиенте:
событие о том, что серве что-то отрпавил нам:
принимаем поток и делаем с ним чё-нить


 
Romm ©   (2007-04-15 15:46) [7]


> проходивший мимо   (15.04.07 15:32) [6]

спасиб, а можно не сохраняя сразу передать? Меня заклинило конечно на этом несохранении, но подругому ведь не получится..


 
DrPass ©   (2007-04-15 15:59) [8]


> заклинило конечно на этом несохранении

Да, заклинило. Что плохого в сохранении в поток? Это ж не на диск писать


 
Romm ©   (2007-04-15 16:04) [9]

А! Ну в поток-то можно, наверно :) Нужно попробовать :))


 
homm ©   (2007-04-15 17:34) [10]

> 800х600х8bit (самое хреновое граф разрешение и передача
> цвета) = 3Mb

Вообще-то 480 кб.


 
Romm ©   (2007-04-17 13:01) [11]

Мастера, отправляю поток с сервера клиенту таким образом:
procedure TMainForm.GrabScreen;
var
 DeskTopDC: HDc;
 DeskTopCanvas: TCanvas;
 DeskTopRect: TRect;
 Bitmap:TBitmap;
 Str:TStream;
begin
 DeskTopDC := GetWindowDC(GetDeskTopWindow);
 DeskTopCanvas := TCanvas.Create;
 DeskTopCanvas.Handle := DeskTopDC;
 DeskTopRect := Rect(0, 0, Screen.Width, Screen.Height);
 Bitmap:=TBitmap.Create;
 Bitmap.Canvas.CopyRect(DeskTopRect, DeskTopCanvas, DeskTopRect);
 Str:=TStream.Create;
 Str.Write(Bitmap,sizeof(Bitmap));
 ServerSocket1.Socket.SendStream(str);
 ReleaseDC(GetDeskTopWindow, DeskTopDC);
 Bitmap.Free;
 Str.Free;
end;


правильно?

Вот только у TClientSocket я не нашел события Socket.ReceiveStream. Есть Socket.ReceiveText, Socket.ReceiveBuf и Socket.ReceiveLength, а как поток принять? подскажите пожалуйста


 
grisme ©   (2007-04-17 13:12) [12]

юзай RecieveBuf - фактически поток и получишь
RecieveText ограничивает ведь до строковой переменной.


 
Рамиль ©   (2007-04-17 13:15) [13]

Ты ответы в своих темах читаешь?
http://delphimaster.net/view/2-1175695178/


 
Romm ©   (2007-04-17 13:26) [14]


> Рамиль ©   (17.04.07 13:15) [13]

сорь, я уж и забыл про ту тему :( Щас пробую


 
Сергей М. ©   (2007-04-17 13:36) [15]


> Romm ©   (17.04.07 13:01) [11]


> правильно?


Нет, неправильно.

Читай справку (она не для Пушкина, меж прочим, писана) :

Note: The Stream passed as a parameter to SendStream becomes “owned” by the windows socket object.  The Windows socket object frees the stream when it is finished with it.  Do not attempt to free the stream after it has been passed as a parameter.


 
Romm ©   (2007-04-17 13:45) [16]


> Do not attempt to free the stream after it has been passed
> as a parameter

эээ.. мне кажется, что тут написано, что не нужно уничтожать "Str" правильнО? :))


 
Сергей М. ©   (2007-04-17 14:16) [17]


> мне кажется


Что значит "кажется" ?

Подчеркнутая строка вроде бы не двусмысленна в своем содержании)


 
Romm ©   (2007-04-17 14:20) [18]

что-то не получается ничего :(( посмотрите пожалуйста, может бы я где нибудь ошибку допустил:

if cmd="go" then
   begin
     Timer1.Enabled:=true;
   end;

procedure TMainForm.Timer1Timer(Sender: TObject);
begin
 GrabScreen;
end;

procedure TMainForm.GrabScreen;
var
 DeskTopDC: HDc;
 DeskTopCanvas: TCanvas;
 DeskTopRect: TRect;
 Bitmap:TBitmap;
 Str:TStream;
 Size:int64;
begin
 DeskTopDC := GetWindowDC(GetDeskTopWindow);
 DeskTopCanvas := TCanvas.Create;
 DeskTopCanvas.Handle := DeskTopDC;
 DeskTopRect := Rect(0, 0, Screen.Width, Screen.Height);
 Bitmap:=TBitmap.Create;
 Bitmap.Canvas.CopyRect(DeskTopRect, DeskTopCanvas, DeskTopRect);
 Str:=TStream.Create;
 Str.Write(Bitmap,sizeof(Bitmap));
 Size:=Str.Size;
 ServerSocket1.Socket.SendBuf(Size,sizeof(Size));
 ServerSocket1.Socket.SendStream(str);
 ReleaseDC(GetDeskTopWindow, DeskTopDC);
 Bitmap.Free;
end;

*********

   10:
     begin
       sc.Socket.SendText("go");
       Reciveing:=false;
       VidioForm.ShowModal;
     end;

procedure TMainForm.ClientSocket1Read(Sender: TObject;
 Socket: TCustomWinSocket);
var
 Buf: array[0..8191] of byte;
 RecivedSize: integer;
 Size: int64;
 AllSize: int64;
 Stream: TMemoryStream;
 Bitmap:TBitmap;
begin
 if not Reciveing then
   begin
     TClientSocket(Sender).Socket.ReceiveBuf(Size, SizeOf(Size));
     Reciveing := true;
     Stream := TMemoryStream.Create;
     AllSize := 0;
   end
 else
   begin
     RecivedSize := TClientSocket(sender).Socket.ReceiveBuf(Buf, SizeOf(Buf));
     Stream.Write(Buf, RecivedSize);
     inc(AllSize, RecivedSize);
     if AllSize = Size then
       begin
         Reciveing := false;
         Bitmap:=TBitmap.Create;
         Stream.Position := 0;
         Bitmap.LoadFromStream(Stream);
         Stream.Free;
         VidioForm.Canvas.Assign(Bitmap);
         Bitmap.Free;
       end;
   end;
end;


ошибка возникает когда сервер пытается передать данные клиенту


 
Steep ©   (2007-04-17 14:22) [19]

У меня такой подвопрос, а если сжимать в jpeg а потом передавать? так можно

jpg.Assign(bmp);
...
Send
...
jpg.free;


 
Romm ©   (2007-04-17 14:24) [20]


> Steep ©   (17.04.07 14:22) [19]

это верно, но займусь я этим когда программа будет подавать малейшие признаки жизни :)


 
Romm ©   (2007-04-17 14:26) [21]


> ошибка возникает когда сервер пытается передать данные клиенту

Abstract Error


 
Сергей М. ©   (2007-04-17 14:27) [22]


> ошибка возникает


Какая ? И что показывает отладчик ?


 
Сергей М. ©   (2007-04-17 14:28) [23]


> Abstract Error


Потому что TStream - абстрактный класс.
Пользуй , к примеру, TMemoryStream


 
Рамиль ©   (2007-04-17 14:31) [24]


> Romm ©   (17.04.07 14:26) [21]
>
> > ошибка возникает когда сервер пытается передать данные
> клиенту
>
> Abstract Error

Это называется смотрю в книгу, вижу фигу.
В клиенте TMemoryStream просто так что ли? По аналогии можно было додумать.


 
Romm ©   (2007-04-17 14:36) [25]


> Сергей М. ©   (17.04.07 14:28) [23]


> Рамиль ©   (17.04.07 14:31) [24]

спасиб-исправил :)
только опять ошибка отправки данных с сервер сокета.
сокет нужно как-то настраивать на клиент, если клиент один?
windows говорит, что нет адреса on API "send"


 
Сергей М. ©   (2007-04-17 14:41) [26]

ServerSocket.Socket.Connections[такое-то соединение].SendЧегоТоТам(..)


 
Romm ©   (2007-04-17 14:45) [27]

вот и я только что туда же пришел :) проверяю...


 
Steep ©   (2007-04-17 14:53) [28]


> У меня такой подвопрос, а если сжимать в jpeg а потом передавать?
>  так можноjpg.Assign(bmp);...Send...jpg.free;

Собственно это был вопрос мастерам :) так можно?


 
Сергей М. ©   (2007-04-17 14:55) [29]


> Steep ©   (17.04.07 14:53) [28]


> так можно?


А подумать ?)


 
Steep ©   (2007-04-17 14:56) [30]

нет я подумал что можно, просто я с сокетом (и вобще с сетью) не работал и не знаю как он функционирует :(


 
Сергей М. ©   (2007-04-17 14:59) [31]


> просто я с сокетом (и вобще с сетью) не работал и не знаю
> как он функционирует


А причем здесь сокеты ?

Если некий метод некоего объекта требует в кач-ве параметра некий объект-наследник класса TStream, то можно ли подсунуть этому методу некий объект, НЕ являющийся таковым ?

Подумай)


 
Romm ©   (2007-04-17 15:02) [32]

О, боже! Теперь клиент не работает :(( щас с ума сойду :)

Access violation at address 004798C3 in module "Client.exe". Read of address 7836663


 
Сергей М. ©   (2007-04-17 15:04) [33]


> Romm ©   (17.04.07 15:02) [32]


см. меню Search -> Find Error ..


 
Рамиль ©   (2007-04-17 15:12) [34]

object Form1: TForm1
 Left = 582
 Top = 308
 Width = 276
 Height = 125
 Caption = "Form1"
 Color = clBtnFace
 Font.Charset = DEFAULT_CHARSET
 Font.Color = clWindowText
 Font.Height = -11
 Font.Name = "MS Sans Serif"
 Font.Style = []
 OldCreateOrder = False
 PixelsPerInch = 96
 TextHeight = 13
 object ServerSocket: TServerSocket
   Active = True
   Port = 4050
   ServerType = stNonBlocking
   OnClientRead = ServerSocketClientRead
   Left = 16
   Top = 8
 end
end

object Form2: TForm2
 Left = 274
 Top = 204
 Width = 761
 Height = 601
 Caption = "Form2"
 Color = clBtnFace
 Font.Charset = DEFAULT_CHARSET
 Font.Color = clWindowText
 Font.Height = -11
 Font.Name = "MS Sans Serif"
 Font.Style = []
 OldCreateOrder = False
 PixelsPerInch = 96
 TextHeight = 13
 object Image: TImage
   Left = 8
   Top = 32
   Width = 713
   Height = 513
   Stretch = True
 end
 object Button3: TButton
   Left = 152
   Top = 0
   Width = 75
   Height = 25
   Caption = "Recive"
   TabOrder = 0
   OnClick = Button3Click
 end
 object Button1: TButton
   Left = 56
   Top = 0
   Width = 75
   Height = 25
   Caption = "Connect"
   TabOrder = 1
   OnClick = Button1Click
 end
 object Button2: TButton
   Left = 264
   Top = 0
   Width = 75
   Height = 25
   Caption = "Disconnect"
   TabOrder = 2
   OnClick = Button2Click
 end
 object ClientSocket: TClientSocket
   Active = False
   ClientType = ctNonBlocking
   Host = "127.0.0.1"
   Port = 4050
   OnRead = ClientSocketRead
   Left = 16
   Top = 8
 end
end


 
Romm ©   (2007-04-17 15:12) [35]

procedure TMainForm.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
Buf: array[0..8191] of byte;
RecivedSize: integer;
Size: int64;
AllSize: int64;
Stream: TMemoryStream;
Bitmap:TBitmap;
begin
if not Reciveing then
  begin
    TClientSocket(Sender).Socket.ReceiveBuf(Size, SizeOf(Size));
    Reciveing := true;
    Stream := TMemoryStream.Create;
    AllSize := 0;
  end
else
  begin
    RecivedSize := TClientSocket(sender).Socket.ReceiveBuf(Buf, SizeOf(Buf));
    Stream.Write(Buf, RecivedSize); // компилятор тут останавливается!
    inc(AllSize, RecivedSize);
    if AllSize = Size then
      begin
        Reciveing := false;
        Bitmap:=TBitmap.Create;
        Stream.Position := 0;
        Bitmap.LoadFromStream(Stream);
        Stream.Free;
        VidioForm.Canvas.Assign(Bitmap);
        Bitmap.Free;
      end;
  end;
end;


 
Romm ©   (2007-04-17 15:21) [36]


> Рамиль ©   (17.04.07 15:12) [34]

а это что такое? :)


 
Рамиль ©   (2007-04-17 15:23) [37]

А подумать?


 
Сергей М. ©   (2007-04-17 15:23) [38]


> Stream.Write(Buf, RecivedSize); // компилятор тут останавливается!


Компилятор никогда не останавливается - он делает свою работу до конца)

А по сабжу - сделай переменную Stream статической.


 
Romm ©   (2007-04-17 15:27) [39]


> статической

это опять на Stream поменять тип?
> А подумать?

просто я, извени, ничего полезного от туда не узнал :) А может просто плохо прочитал :)


 
Рамиль ©   (2007-04-17 15:32) [40]


> Romm ©   (17.04.07 15:27) [39]

Это дфмки от моего рабочего примера.

А так Сергей прав, скорее всего в разрушенный/несозданный Stream пытаешься писать.



Страницы: 1 2 вся ветка

Текущий архив: 2007.05.06;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.03 c
15-1175826761
Slider007
2007-04-06 06:32
2007.05.06
С днем рождения ! 6 апреля


15-1175693490
vasIZmax
2007-04-04 17:31
2007.05.06
Может кто-нибудь что-нибудь подскажет


2-1176534489
Dush
2007-04-14 11:08
2007.05.06
проблемы с IF


15-1176007036
Просто Васёк
2007-04-08 08:37
2007.05.06
Христос Воскресе!


15-1175974189
mike888777666
2007-04-07 23:29
2007.05.06
антиспам