|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Клиент- Сервер послать скриншот
Здраствуйте.
Есть клиент и сервер. Сервер через некоторое время делает скриншот рабочего стола, сохраняет его, затем посылает клиенту. Клиент в свою очередь тоже его сохраняет, а затем загружает в Image. После чего наблюдается странная ситуация. Снимок прилагется. Сервер Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls, ScktComp, Clipbrd, ExtCtrls; type TForm1 = class(TForm) ServerSocket1: TServerSocket; ProgressBar1: TProgressBar; StatusBar1: TStatusBar; Button2: TButton; Timer1: TTimer; Button1: TButton; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); procedure ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket); procedure ServerSocket1ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket); procedure Button2Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; MS: TMemoryStream; // Буфер для файла implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin ServerSocket1.Open; // Открываем сокет end; procedure TForm1.FormDestroy(Sender: TObject); begin ServerSocket1.Close; // Закрываем сокет end; procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); begin if Socket.ReceiveText = 'end' then // Если клиент принял файл, то... begin StatusBar1.SimpleText := 'Клиент принял файл'; MS.Free; // Убиваем буфер end; end; procedure TForm1.ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket); begin StatusBar1.SimpleText := 'Соединение установлено'; end; procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket); begin StatusBar1.SimpleText := 'Соединение не установлено'; end; procedure TForm1.Button2Click(Sender: TObject); begin Timer1.Enabled:=True; end; procedure TForm1.Timer1Timer(Sender: TObject); var bmp: TBitmap; Size: integer; P: ^Byte; begin bmp := TBitmap.Create; bmp.Width := Screen.Width; bmp.Height := Screen.Height; BitBlt(bmp.Canvas.Handle, 0, 0, Screen.Width, Screen.Height, GetDC(GetDesktopWindow), 0, 0, SRCCopy); Clipboard.Assign(bmp); bmp.SaveToFile('D:\FormImage.bmp'); begin MS := TMemoryStream.Create; // Создаём буфер для файла MS.LoadFromFile('D:\FormImage.bmp'); // Загружаем файл в буфер // Посылаем информацию о файл (команда # название # размер) ServerSocket1.Socket.Connections[0].SendText('file#'+'D:\FormImage.bmp'+'#'+IntToStr(MS.Size)+'#'); MS.Position := 0; // Переводим каретку в начало файла P := MS.Memory; // Загружаем в переменную "P" файл Size := ServerSocket1.Socket.Connections[0].SendBuf(P^, MS.Size); // Посылаем файл // Выводим прогресс ProgressBar1.Position := Size*100 div MS.Size; StatusBar1.SimpleText := 'Отправлено '+IntToStr(Size)+' из '+IntToStr(MS.Size)+' байт' end; end; procedure TForm1.Button1Click(Sender: TObject); begin Timer1.Enabled:=False; end; end. Клиент Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, ScktComp, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Label1: TLabel; ClientSocket1: TClientSocket; ProgressBar1: TProgressBar; StatusBar1: TStatusBar; Image1: TImage; procedure Writing(Text: string); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket); procedure ClientSocket1Disconnect(Sender: TObject; Socket: TCustomWinSocket); procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); // Процедура записи в данных в буфер private { Private declarations } Name: string; // Имя файла Size: integer; // Размер файла Receive: boolean; // Режим клиента MS: TMemoryStream; // Буфер для файла x,y: integer; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin ClientSocket1.Open; // Открываем сокет Receive := false; // Режим клиента - приём команд end; procedure TForm1.FormDestroy(Sender: TObject); begin ClientSocket1.Close; // Закрываем сокет end; procedure TForm1.ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket); begin StatusBar1.SimpleText := 'Соединение установлено'; end; procedure TForm1.ClientSocket1Disconnect(Sender: TObject; Socket: TCustomWinSocket); begin StatusBar1.SimpleText := 'Соединение не установлено'; end; procedure TForm1.Writing(Text: string); begin if MS.Size < Size then // Если принято байт меньше размера файла, то... MS.Write(Text[1], Length(Text)); // Записываем в буфер // Выводим прогресс закачки файла ProgressBar1.Position := MS.Size*100 div Size; StatusBar1.SimpleText := 'Принято '+IntToStr(MS.Size)+' из '+IntToStr(Size); if MS.Size = Size then // Если файл принят, то... begin Receive := false; // Переводим клиента в нормальный режим MS.Position := 0; // Переводим каретку в начало буфера MS.SaveToFile(Name); // Сохраняем файл ClientSocket1.Socket.SendText('end'); // Посылаем команду "end", то есть файл принят Form1.Image1.Picture.LoadFromFile('D:\FormImage.bmp'); MS.Free; // Убиваем буфер StatusBar1.SimpleText := 'Файл принят'; end; end; procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); var Rtext: string; // Принятый текст begin Rtext := Socket.ReceiveText; if Receive then // Если клиент в режиме приёма файла, то... Writing(RText) // Записываем данные в буфер else // Если клиент не в режиме приёма файла, то... if Copy(Rtext, 0, Pos('#', Rtext) -1) = 'file' then // Если это файл, то... begin MS := TMemoryStream.Create; // Создаём буфер для файла Delete(Rtext, 1, Pos('#', Rtext)); // Определяем имя файла Name := Copy(Rtext, 0, Pos('#', Rtext) -1); // Определяем имя файла Delete(Rtext, 1, Pos('#', Rtext)); // Определяем размер файла Size := StrToInt(Copy(Rtext, 0, Pos('#', Rtext) -1)); // Определяем размер файла Delete(Rtext, 1, Pos('#', Rtext)); // Удаляем последний разделитель Label1.Caption := 'Размер файла: '+IntToStr(Size)+' байт'; // Выводим размер файла Receive := true; // Переводим сервер в режим приёма файла Writing(RText); // Записываем данные в буфер end; end; end. Подскажите пожалуйста что не так. Последний раз редактировалось Aristarh Dark, 05.05.2011 в 16:11. |