Jul 07

Программирование сокетов. Продолжение

Начало читайте в предыдущей статье под названием "Программирование сокетов"...

Теперь уже нужно виделить компоненты TServerSocket, и в Object Inspector на вкладке Events в событии onClientRead (это событие появляетя, когда клиент отсылает какие то данные серверу) пишем следующее:..

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
c,s:String;
FStream:TFileStream;
SF:Pchar;
begin
S:=FormatDateTime('hhmmss',TIme());//Здесь мы генерируем имя нашей картинки
c:=Socket.ReceiveText; //именно сюда записываются данные, которые пришли от клиента
if c='screen' then //если пришел запрос, и он отвечает нашим требованиям
begin
sf:=Pchar(s+'.bmp');
CopyScreen(Sf); //копируем содержимое экрана и сохраняем его
sendFile(sf); //отсылаем сохраненный файл
end;
end;

Сначало мы переменной S даем результат исполнения функции FormatDateTime(), в итоге получим строковое представление времени в системе, которое записано будет в переменную S — поскільку время постоянно изменяется, мы постоянно получать будем новое значение переменной. Потом проверяем,  пришли ли данные от клиента — если да, тогда копируем экран и отправляем копию.

Теперь относительно клиента. Создаем новый проект и потом кидаем на форму компонент TClientSocket, а также TEdit,TListBox, Tbutton и Tlabel.

У свойства Port TClientSocket необходимо ввести значение порта, которое вы дали серверу, свойству Address надо указать IP-адрес сервера. Эту возможность мы выполняем с помощью компонента Edit1. В событии OnClick компоненте SpeedButton1 пишем следующее:

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
if edit1.Text<>'' then
begin
ClientSocket1.Address:=Edit1.Text; //заполняем свойство Address…
ClientSocket1.Active:=True; //…и активируем сокет
end;
end;

Думаю здесь должно быть все предельно ясно...
Socket: TCustomWinSocket);
begin
LIstBox1.Items.Add('Связь установлена з'+Edit1.Text+'успешно установленна!');
end;

Это событие возникает в том случае, когда клиент успешно установил связь с сервером

procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket1.Socket.SendText('screen');{Отсылаем серверу строку screen}
end;

После чего он должен сделать копию экрана и отправить ее нам

procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
s1,s:String;
begin
s:=Socket.ReceiveText; //принимаем данные
if reciving then //если есть что принимать
begin
fs.Write(s[1],length(s)); //записываем их
if fs.Size=DataSize then //если размер записанных данных равен размеру принятых
begin
fs.Free; //освобождаем поток
Reciving:=False;  // останавливаем записывание
ShellExecute(handle,'open',Pchar(s2),nil,pchar(s2),SW_SHOW ) //запускаем то, что приняли
end;
end;
if copy(s,1,5)='Size:' then //если пришли размер и имя файла
begin
s1:=Copy(s,6,Pos('Name:',s)-6); //копируем сначало размер
DataSize:=StrToInt(s1);
Delete(s,1,Pos('Name',s)-1); //удаляем его с общих данных
if copy(s,1,5)='Name:' then
begin
s2:=Copy(s,6,Pos(#0,s)-6); //копируем имя
//shortName(s2);
Delete(s,1,Pos(#0,s)); //удаляєм его с общих данных
Reciving:=True; //переходим в режим записи в файл
begin
fs:=TfileStream.Create(s2,FmCreate); //создаем сам файл
fs.Write(s[1],length(s)); //и наконец, записываем данные
end;
end;
end;
end;

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

procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
ListBox1.Items.Add('Связь прервана!');
end;

Это событие возникает тогда, когда прерывается связь

procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
ListBox1.Items.Add('Не могу соединится с сервером!!!!!');
ErrorCOde:=0;
end;
end.

А данное событие возникает тогда, когда сам клиент не может связатся с сервером.

Спонсор поста: имеете желание узнать больше о языке html? Заходите на интернет-ресурс barionics.com. У нас вы сможете не только узнать много  интересных фактов о хтмл, но и получить новые знания по интересующих вопросах.


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

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