Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Рисунок через сокет


Страницы:   1 2 3 4

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 кб.


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо