Шаг 51.
Пример использования компонентов TNMStrm и TNMStrmServ

    На этом шаге мы рассмотрим использование компонентов TNMStrm и TNMStrmServ.

    Создадим новое приложение и поместим на форму два окна редактирования, одну командную кнопку, два поля мемо и компоненты TNMStrm и TNMStrmServ.


Рис.1. Пример приложения

    Для простоты рассмотрим пример, в котором будет пересылаться текст. Только в отличие от рассмотренного ранее примера с компонентами TNMMsg и TNMMsgServ посылать можно будет сразу несколько строк, для чего и будет использоваться один из компонентов мемо. Во второй такой компонент будет выводиться отчет о результатах деятельности. В первом поле редактирования нужно будет указывать имя или адрес получателя, во втором поле - имя отправителя. Изменять значение по умолчанию для порта, которое равно 6711, мы не будем. Если вы хотите, то можете добавить для этой цели еще одно окно редактирования. Далее, после ввода текста сообщения, можно нажимать на кнопку Послать, обработчик события OnClick которой будет отсылать приготовленное сообщение. Эту процедуру вы можете найти в листинге примера. Здесь все достаточно ясно: в процедуре создается поток в динамической памяти, в него последовательно переписываются строки сообщения из компонента TMemo, затем вызывается метод PostIt и освобождается память, выделенная под созданный ранее поток. Кроме того в этой процедуре переписываются в соответствующие свойства компонента имя получателя и имя отправителя.

    После того, как сервер потоков получил поток, генерируется событие OnMSG, в обработчик которого вы должны добавить код, выполняющий обработку полученного сообщения. В нашем случае в этой процедуре полученный через параметр strm поток копируется в созданный строковый поток SS, и уже содержимое этого потока переписывается в компонент мемо, озаглавленный Журнал событий. Все остальные процедуры приложения занимаются обработкой ошибок либо записывают в Журнал событий сообщения об ошибках и об успешном завершении методов и событий.

    Текст приложения:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, NMSTRM, Psock;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Memo1: TMemo;
    Button1: TButton;
    Memo2: TMemo;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    NMStrmServ1: TNMStrmServ;
    NMStrm1: TNMStrm;
    procedure Button1Click(Sender: TObject);
    procedure NMStrm1MessageSent(Sender: TObject);
    procedure NMStrmServ1MSG(Sender: TComponent; const sFrom: String;
      strm: TStream);
    procedure NMStrmServ1Connect(Sender: TObject);
    procedure NMStrmServ1ConnectionFailed(Sender: TObject);
    procedure NMStrmServ1Disconnect(Sender: TObject);
    procedure NMStrmServ1HostResolved(Sender: TComponent);
    procedure NMStrmServ1InvalidHost(var Handled: Boolean);
    procedure NMStrmServ1ClientContact(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  MS: TMemoryStream;
  I : Integer;
begin
  NMStrm1.Host := Edit1.Text;
  NMStrm1.FromName := Edit2.Text;
  MS := TMemoryStream.Create;
  try
   for I := 0 to Memo2.Lines.Count -1 do
        StreamLn(MS, Memo2.Lines.Strings[I]);
   NMStrm1.PostIt(MS);
  finally
   MS.Free;
  end; 
end;

procedure TForm1.NMStrm1MessageSent(Sender: TObject);
begin
  Memo1.Lines.Add('Послали поток');
end;

procedure TForm1.NMStrmServ1MSG(Sender: TComponent; const sFrom: String;
  strm: TStream);
var
  SS: TStringStream;
begin
  SS := TStringStream.Create('');
  try
   SS.CopyFrom(strm, strm.size);
   Memo1.Lines.Add(timetostr(time)+' от "'+sFrom+'" получено сообщение');
   Memo1.Lines.Add('начало -----');
   Memo1.Lines.Add(SS.DataString);
   Memo1.Lines.Add('конец ------');
  finally
   SS.Free;
  end;
end;

procedure TForm1.NMStrmServ1Connect(Sender: TObject);
begin
  Memo1.Lines.Add('Соединились с '+NMStrm1.Host);
end;

procedure TForm1.NMStrmServ1ConnectionFailed(Sender: TObject);
begin
  ShowMessage('С сервером соединиться не удалось');
end;

procedure TForm1.NMStrmServ1Disconnect(Sender: TObject);
begin
  Memo1.Lines.Add('Соединение завершено');
end;

procedure TForm1.NMStrmServ1HostResolved(Sender: TComponent);
begin
  Memo1.Lines.Add('Сервер обнаружен');
end;

procedure TForm1.NMStrmServ1InvalidHost(var Handled: Boolean);
var
  TmpStr: String;
begin
 If InputQuery('Неверный адрес!', 'Укажите имя или адрес получателя:', TmpStr) then
 Begin
   NMStrm1.Host := TmpStr;
   Handled := True;
 End;
end;

procedure TForm1.NMStrmServ1ClientContact(Sender: TObject);
begin
  NMStrmServ1.ReportLevel := Status_Basic;
  NMStrmServ1.TimeOut := 30000;
  Memo1.Lines.Add('Соединение с клиентом');
end;

end.
Текст этого приложения можно взять здесь.

    На следующем шаге мы рассмотрим компонент TNMUDP.




Предыдущий шаг Содержание Следующий шаг