Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.05.06;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.043 c
2-1176446453
Бульбаш
2007-04-13 10:40
2007.05.06
Проблема с запуском софта


1-1172824942
Kirflaer
2007-03-02 11:42
2007.05.06
Как перенести текст из RichEdit с сохранением форматирования


1-1173692656
Krants
2007-03-12 12:44
2007.05.06
Сортировка в ShellListView


3-1171141190
Grant
2007-02-10 23:59
2007.05.06
TQuery и память


2-1176317178
Strate
2007-04-11 22:46
2007.05.06
Совместная работа с файлами





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский