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

Сегодня мы поговорим о программировании сокетов на 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 вы можете скачать абсолютно бесплатно любую компьютерную игру, начиная от самых простых аркад и заканчивая архисложными стратегиями.