![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Рисунок через сокет
Romm © (2007-04-15 11:30:00)******************************************************************************** **********************************
Я как-то говорил о этой проблеме, но решил повториться, т.к. мне никто не дал вразумительного ответа.
Подскажите пожалуйста как с сервера передать клиенту снимок рабочего стола, не сохраняя его на харде?
Спасиб
Сергей М. (2007-04-17 14:55:00) [41]
> Steep © (17.04.07 14:53) [28]
> так можно?
А подумать ?)
Steep (2007-04-17 14:53:00) [42]
> У меня такой подвопрос, а если сжимать в jpeg а потом передавать?
> так можноjpg.Assign(bmp);...Send...jpg.free;
Собственно это был вопрос мастерам :) так можно?
Romm (2007-04-17 14:45:00) [43]вот и я только что туда же пришел :) проверяю...
Сергей М. (2007-04-17 14:41:00) [44]ServerSocket.Socket. Connections[такое-то соединение].SendЧегоТоТам(..)
Romm (2007-04-17 14:36:00) [45]
> Сергей М. © (17.04.07 14:28) [23]
> Рамиль © (17.04.07 14:31) [24]
спасиб-исправил :)
только опять ошибка отправки данных с сервер сокета.
сокет нужно как-то настраивать на клиент, если клиент один?
windows говорит, что нет адреса on API 'send'
Рамиль (2007-04-17 14:31:00) [46]
> Romm © (17.04.07 14:26) [21]
>
> > ошибка возникает когда сервер пытается передать данные
> клиенту
>
> Abstract Error
Это называется смотрю в книгу, вижу фигу.
В клиенте TMemoryStream просто так что ли? По аналогии можно было додумать.
Сергей М. (2007-04-17 14:28:00) [47]
> Abstract Error
Потому что TStream - абстрактный класс.
Пользуй , к примеру, TMemoryStream
Сергей М. (2007-04-17 14:27:00) [48]
> ошибка возникает
Какая ? И что показывает отладчик ?
Romm (2007-04-17 14:26:00) [49]
> ошибка возникает когда сервер пытается передать данные клиенту
Abstract Error
Romm (2007-04-17 14:24:00) [50]
> Steep © (17.04.07 14:22) [19]
это верно, но займусь я этим когда программа будет подавать малейшие признаки жизни :)
Steep (2007-04-17 14:22:00) [51]У меня такой подвопрос, а если сжимать в jpeg а потом передавать? так можно
jpg.Assign(bmp);
...
Send
...
jpg.free;
Romm (2007-04-17 14:20:00) [52]что-то не получается ничего :(( посмотрите пожалуйста, может бы я где нибудь ошибку допустил:
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;
ошибка возникает когда сервер пытается передать данные клиенту
Сергей М. (2007-04-17 14:16:00) [53]
> мне кажется
Что значит "кажется" ?
Подчеркнутая строка вроде бы не двусмысленна в своем содержании)
Romm (2007-04-17 13:45:00) [54]
> Do not attempt to free the stream after it has been passed
> as a parameter
эээ.. мне кажется, что тут написано, что не нужно уничтожать "Str" правильнО? :))
Сергей М. (2007-04-17 13:36:00) [55]
> 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:26:00) [56]
> Рамиль © (17.04.07 13:15) [13]
сорь, я уж и забыл про ту тему :( Щас пробую
Рамиль (2007-04-17 13:15:00) [57]Ты ответы в своих темах читаешь?
http://delphimaster.ru/cgi-bin/forum.pl?id=1175695178&n=18
grisme (2007-04-17 13:12:00) [58]юзай RecieveBuf - фактически поток и получишь
RecieveText ограничивает ведь до строковой переменной.
Romm (2007-04-17 13:01:00) [59]Мастера, отправляю поток с сервера клиенту таким образом:
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, а как поток принять? подскажите пожалуйста
homm (2007-04-15 17:34:00) [60]> 800х600х8bit (самое хреновое граф разрешение и передача
> цвета) = 3Mb
Вообще-то 480 кб.