Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.08.2011, 21:16   #1
valdys
Новичок
Джуниор
 
Регистрация: 15.08.2010
Сообщений: 2
По умолчанию Передача Print Screen'а от клиента к серверу (через сокеты)

Помогите пожалуйста исправить код, передаю принт скрин от клиента к серверу(передается только один раз).

Клиент

PHP код:
unit Unit1;

interface

uses
  Windows
MessagesSysUtilsVariantsClassesGraphicsControlsForms,
  
DialogsStdCtrlsScktCompExtCtrls;

type
  TForm1 
= class(TForm)
    
Edit1TEdit;
    
Edit2TEdit;
    
Edit3TEdit;
    
Button1TButton;
    
ClientSocket1TClientSocket;
    
Button2TButton;
    
Button3TButton;
    
procedure Button1Click(SenderTObject);
    
procedure ClientSocket1Read(SenderTObjectSocketTCustomWinSocket);
    
procedure Button2Click(SenderTObject);
    
procedure Button3Click(SenderTObject);
  private
    { Private 
declarations }
    
Stop:boolean;
  public
    { Public 
declarations }
  
end;

var
  
Form1TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(SenderTObject);
begin

 ClientSocket1
.Port := strtoint(edit2.text);        //устанавливаем порт
 
ClientSocket1.Address := edit1.text;                 //IP адресс сервера  если на одном компе можно просто 192.168.1.2
 
ClientSocket1.Active :=True;
end;

procedure TForm1.ClientSocket1Read(SenderTObject;
  
SocketTCustomWinSocket);
begin
edit3
.Text:= Socket.ReceiveText;
end;



procedure TForm1.Button2Click(SenderTObject);
begin
ClientSocket1
.Active :=false;
Stop:=True;
end;

procedure TForm1.Button3Click(SenderTObject);
var
  
BMP:TBitmap;
  
SBMP:TMemoryStream;
  
DC:HDC;
  
LenInt64;
begin
  BMP
:=TBitmap.Create;
  
SBMP:=TMemoryStream.Create;

  
DC:=GetDC(0);

    
bmp.Width := Screen.Width;
    
bmp.Height := Screen.Height;
    
BitBlt(bmp.Canvas.Handle0,0Screen.WidthScreen.Height,GetDC(0), 0,0,SRCCOPY);

        
StretchBlt(bmp.Canvas.Handle,0,0,(Screen.Width-400),(Screen.Height-400),bmp.Canvas.Handle,0,0,Screen.Width,Screen.Height,SRCCOPY);
        
bmp.Width:=Screen.Width-400;
        
bmp.Height:=Screen.Height-400;

  
BMP.SaveToStream(SBMP);
  
Len := SBMP.Size;
  
ClientSocket1.Socket.SendBuf(Len,SizeOf(Int64));
  
SBMP.Position:=0;
  
ClientSocket1.Socket.SendStream(SBMP);

  
sbmp:=nil;
  
sbmp.Free;

  
BMP.Free;
  
end;

end
Сервер
PHP код:
unit Unit1;

interface

uses
  Windows
MessagesSysUtilsVariantsClassesGraphicsControlsForms,
  
DialogsStdCtrlsScktCompSpinExtCtrlsjpegMenus;

type

  TForm1 
= class(TForm)

    
ServerSocket1TServerSocket;
    
Edit1TEdit;
    
MainMenu1TMainMenu;
    
N1TMenuItem;
    
Desktop1TMenuItem;
    
Send1TMenuItem;
    
N2TMenuItem;
    
Help1TMenuItem;
    
Save1TMenuItem;
    
procedure ServerSocket1ClientRead(SenderTObject;
      
SocketTCustomWinSocket);
    
procedure FormCreate(SenderTObject);
    
procedure N1Click(SenderTObject);
    
procedure Desktop1Click(SenderTObject);
    
procedure Send1Click(SenderTObject);
    
procedure Help1Click(SenderTObject);
  private
    { Private 
declarations }
    
SBMP:TMemoryStream;
  public
    { Public 
declarations }
  
end;
 
type
     TState
=(stNone,stData);
var
    
Form1TForm1;
    
StateTState=stNone;
    
Msg:string;
    
LenInt64;
    
CountReceivedInt64;

implementation

uses Unit2
Unit3;

{
$R *.dfm}

procedure TForm1.ServerSocket1ClientRead(SenderTObject;
  
SocketTCustomWinSocket);
begin
Msg
:= Msg+Socket.ReceiveText;

while 
Msg<>'' do
  
begin
    
case State of
      stNone
:
        
begin
          
if Length(Msg)<SizeOf(Int64then Exit;
          
State := stData;
          
Move(Msg[1],Len,SizeOf(int64));
          
Delete(Msg,1,SizeOf(int64));
        
end;
      
stData:
        
begin
          CountReceived 
:= CountReceived+SBMP.Write(Msg[1],Length(Msg));
          
Msg := '';
          if 
CountReceived=Len then
          begin
            State 
:= stNone;
            
SBMP.Position:=0;
            
form2.Image1.Picture.Bitmap.Height:=100;
            
form2.Image1.Picture.Bitmap.Width:=100;
            
form2.Image1.Picture.Bitmap.LoadFromStream(SBMP);
          
end;
        
end;
    
end;
  
end;
  
end;




procedure TForm1.FormCreate(SenderTObject);
begin
   SBMP
:=TMemoryStream.Create;
  
SBMP.Position:=0;
end;

procedure TForm1.N1Click(SenderTObject);
begin
 ServerSocket1
.Port := strtoint(form3.edit1.text);    //Устанавливаем порт
 
ServerSocket1.Active :=True;
 
form1.Caption:='Сервер запущен';
end;

procedure TForm1.Desktop1Click(SenderTObject);
begin
form2
.visible:=true;
end;

procedure TForm1.Send1Click(SenderTObject);
begin
ServerSocket1
.Socket.Connections[0].SendText(edit1.text);
end;

procedure TForm1.Help1Click(SenderTObject);
begin
Showmessage
('F5 - Передать текст клиенту');
end;



end
valdys вне форума Ответить с цитированием
Старый 24.08.2011, 21:35   #2
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
Код:
  sbmp:=nil;
  sbmp.Free;
Это порадовало.
mss вне форума Ответить с цитированием
Старый 25.08.2011, 02:29   #3
valdys
Новичок
Джуниор
 
Регистрация: 15.08.2010
Сообщений: 2
По умолчанию

Я так понял что очищаю TMemoryStream раньше чем успело передатся изображение?
valdys вне форума Ответить с цитированием
Старый 25.08.2011, 02:45   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вы его вообще не очищаете.
присвоив nil, вы теряете ссылку на поток, итог утечка памяти.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 25.08.2011, 09:37   #5
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
итог утечка памяти
Никакой утечки здесь нет. Просто полная несуразица.
Притом что в справке, которая как известно для Пушкина, написано:

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.
mss вне форума Ответить с цитированием
Старый 25.08.2011, 12:46   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Притом что в справке, которая как известно для Пушкина, написано:
а вот нормально не выразится?
забыл, ибо не пишу на Делфи(серьезно) уже год как минимум.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача массива через сокеты Kingcss Работа с сетью в Delphi 0 10.07.2011 16:14
Передача файлов через сокеты Joker_vad Работа с сетью в Delphi 1 03.12.2010 12:09
Расшифровать код (передача ФАЛОВ через сокеты) хомякec Помощь студентам 1 18.05.2010 15:54
Передача файла от клиента к серверу TFileStream rombler69 Работа с сетью в Delphi 1 30.03.2010 17:45