Jul 07

Программирование сокетов

Сегодня мы поговорим о программировании сокетов на Delphi (напомним, сокет  представляет собой программный интерфейс, который обеспечивает информацонный обмен между процессами)...

Мы рассмотрим компоненты TServerSocket и также TClientSocket и напишем небольшую программку, которая их использует.

Давайте напишем прогу для удаленного слежения за компьютером.

Т. е. на удаленном компьютере будет розмещена серверная часть утилити и когда клиент установит связь и даст запрос на наш сервер, она сделает снимок экрана удаленного компа, сохранит его в файл и далее отошлет именно к нам.

Начинаем работу... Запускаем Делфи... Нужные нам компоненты ClientSocket и ServerSocket по умолчанию не установлены, поэтому кликаем на вкладку Component/Install Packages, далее жмем кнопку под названием Add, заходим в директорию Bin и там находим файл dclsockets70.bpl. Вибираем его и нажимаем Открыть и ОК. И вот теперь уже на палитре компонентов на вкладке Internet появились  необходимые для нашей работы компоненты.

Сначала писать мы будем серверную часть. С данной целью скидывайте на форму компонент TServerSocket. В свойствах Port надо указать номер порта, который откроет наш сервер и будет прослушивать, номер порта нужно выбирать в диапазоне от 1025 до 65535, потому что порты ниже 1024,  часто бывают зарезервированы системой. Давайте виберем для этой цели значение порта - 3528.

Перейдем в Object inspector на вкладку под названием Events, событие OnCreate, кликнем по ней 2 раза и Delphi сгенерирует код, к которому добавляем следующее:

procedure TForm1.FormCreate(Sender: TObject);
begin
ServerSocket1.Active:=True; //Активизация сокета
end;
Когда создастся главная форма программы, наш сервер перейдет в режим ожидания запросов от клиентов на заданом порте, т.е. будет ждать, когда к порту подсоединится клиент и будет установлена связь.

МеждуType и Private напишите заголовок следующей функции - function CopyScreen(FName:string):integer; Нажмите Ctrl+Shift+C, после чего Delphi сгенерирует заготовку функции.

А вот, собственно, и функция:
var
hd:HDC; //переменная типа HDC*— это тип рисования собственно Windows
canvas:Tcanvas;
Bit:TBItmap;
begin
hd:=GEtDC(0); //получаем контекст окна, указаного в виде параметра
canvas:=Tcanvas.Create();
bit:=Tbitmap.Create();
bit.Width:=Screen.Width;
Bit.Height:=Screen.Height;
canvas.Handle:=hd;
bit.Canvas.CopyRect(Rect(0,0,bit.Width,bit.Height),Canvas,Rect(0,0,Screen.Width,screen.Height)); //копируем содержимое экрана
Bit.SaveToFile(Fname); //и сохраняем  как картинку
bit.Free;
ReleaseDC(0,hd);
canvas.Free;
result:=1;
end;
С помощью функции  GEtDC(), мы получаем контекст рисования экрана, потом инициализируется переменная типа TCanvas. Мы связываем их с помощью простого придоставления значения canvas.Handle:=hd; После этого мы копируем содержимое экрана, сохраняем как изображение и освобождаем память.

В областе глобальних переменных пишем переменную FS типа TfileStream;

Потом аналогичным методом описываем следующую функцию:
function TForm1.SEndFile(var DropFilename: Pchar): integer;
var
FSize:Integer; //Тут сохраняем размер нашего файла
Socket: TCustomWinSocket;
begin
Result:=-1;
fs:=TfileStream.Create(DropFilename,FmOpenRead); // открываем файл для чтения
try
fs.Position:=0; //рамку считывания устанавливаем в начале файла
Socket.SendText('Size:'+IntTostr(fs.Size)+'Name:'+DropFIlename+#0); {отсылаем через сокет размер нашего файла}
Socket.SendStream(fs); //отсылаем собственно сам файл
finally
result:=1;
end;
end;

Здесь наверно все понятно - сначало отправляется простая строка, которая вмещает имя и размер нашего файла, а потом и сам файл...

Продолжение в следующей статье...

Спонсор поста: не знаете на каком сайте можно скачать игры на компьютер бесплатно? Постоянно в конце скачки просят отослать платное СМС для активации? На игровом портале gameshare.in вы можете скачать абсолютно бесплатно любую компьютерную игру, начиная от самых простых аркад и заканчивая архисложными стратегиями.


Поделитесь вашими мыслями

Поддерживаемые теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>