Шаг 37.
Создание Internet-приложений в среде Delphi. Компоненты TNMMsg и TNMMsgServ

    На этом шаге мы рассмотрим организацию обмена сообщениями.

    Эти компоненты обмениваются простыми текстовыми сообщениями в кодах ASCII по Интернет или интранет с использованием протокола TCP/IP. Вы можете использовать их для создания "чата" в Интернет или для программы переговоров по локальной сети. При этом на хост-компьютере, на который посылается сообщение, должен быть запущен сервер, использующий компонент TNMGeneralServer, например, компонент TNMMsgServ, который является производным от компонента TNMGeneralServer.

    Для того, чтобы компонент TNMMsg смог отправить сообщение, вам нужно указать в свойстве Host удаленный компьютер, на который вы хотите его отправить. Это может быть имя или IP-адрес. Кроме этого, значение свойства Port должно соответствовать значению этого свойства у компонента на удаленном компьютере. Стандартный порт, который "слушает" серверный компонент, имеет номер 6711. В свойстве FromName укажите имя своего компьютера, чтобы получатель мог знать, от кого получено сообщение. После определения этих свойств вы можете отправить сообщение, вызвав метод PostIt. Если метод выполняется успешно, генерируется событие OnMessageSent. У этого компонента только один свой метод PostIt, остальные наследуются. Свойство FromName - единственное свое, остальные наследуются.

    Компонент TNMMsgServ предназначен для получения сообщений, отправленных компонентом TNMMsg. У него нет своих свойств и методов, только унаследованные. Главное событие серверного компонента - это событие OnMSG. Возникает оно при получении сообщения, текст которого передается обработчику события через параметр sMsg. Другой параметр этого обработчика - sFrom - содержит имя отправителя.

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


    Пример. Вам нужно создать новое приложение Delphi и пометить на него три метки, три поля редактирования, одну командную кнопку и два компонента ТМеmо. Кроме этого в форму нужно добавить компоненты TNMMsg и TNMMsgServ. Первый понадобится нам для отправки сообщений, второй будет заниматься приемом. Свойство Caption у трех меток измените в соответствии с рисунком 1.


Рис.1. Пример работы приложения

    Удалите значения по умолчанию у свойств Text полей редактирования и у свойств Lines Memo-компонентов. Измените свойство Caption у командной кнопки и добавьте в обработчик события OnClick следующий текст:

procedure TForm1.Button1Click(Sender: TObject);
begin
  NMMsg1.FromName := Edit2.Text;
  NMMsg1.Host  := Edit3.Text;
  NMMsg1.PostIt(Edit1.Text);
end;

    В этой процедуре присваиваются значения свойствам FromName и Host, после чего вызывается метод PostIt, и адресату отправляется строка из поля редактирования Edit1. Для начала вы можете послать сообщение себе самому, указав в качестве IP-адреса получателя IP-адрес своего компьютера. Если ваш компьютер подключен к локальной вычислительной сети, то вы можете запустить эту же программу на другой машине и обмениваться сообщениями между двумя машинами.

    Получаемые сообщения будут отображаться в компоненте Memo1 в формате "[отправитель] Текст сообщения". Компонент Меmо2 используется для ведения протокола. В нем каждое отправленное или полученное сообщение оставляет соответствующую строку (см. рис. 1). Эти компоненты заполняются при получении сообщения обработчиком события OnMSG компонента NMMSGServ1, в который вы должны добавить следующий текст:

procedure TForm1.NMMSGServ1MSG(Sender: TComponent; const sFrom,
  sMsg: String);
begin
  Memo2.Lines.Add('Получено сообщение от '+sFrom);
  Memo1.Lines.Add('['+sFrom+'] '+sMsg);
end;

    При отправке сообщения обработчик события OnMessageSent компонента TNMMsg1 будет добавлять в компонент Меmо2 строку, если вы вставите в него следующий оператор:

procedure TForm1.NMMsg1MessageSent(Sender: TObject);
begin
  Memo2.Lines.Add('Сообщение отправлено');
end;

    В качестве адреса получателя, который должен определять значение для свойства Host компонента TNMMsg1, вы можете указать имя или IP-адрес нужной машины. Если ваша машина не имеет установленного IP-адреса, то вы можете задать в сетевых настройках Windows, например, значение 192.168.1.XXX, где вместо XXX вы можете положить число от 1 до 255. В случае, если обмен сообщениями происходит на одном и том же компьютере, используйте его адрес 127.0.0.1. Текст приложения:

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Button1: TButton;
    Memo1: TMemo;
    Memo2: TMemo;
    NMMsg1: TNMMsg;
    NMMSGServ1: TNMMSGServ;
    procedure Button1Click(Sender: TObject);
    procedure NMMSGServ1MSG(Sender: TComponent; const sFrom, sMsg: String);
    procedure NMMsg1MessageSent(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  NMMsg1.FromName := Edit2.Text;
  NMMsg1.Host  := Edit3.Text;
  NMMsg1.PostIt(Edit1.Text);
end;

procedure TForm1.NMMSGServ1MSG(Sender: TComponent; const sFrom,
  sMsg: String);
begin
  Memo2.Lines.Add('Получено сообщение от '+sFrom);
  Memo1.Lines.Add('['+sFrom+'] '+sMsg);
end;

procedure TForm1.NMMsg1MessageSent(Sender: TObject);
begin
  Memo2.Lines.Add('Сообщение отправлено');
end;

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

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




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