На этом шаге мы рассмотрим использование компонентов 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.