Форум: "Начинающим";
Текущий архив: 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