首页 | 社区 | 博客 | 招聘 | 文章 | 新闻 | 下载 | 读书 | 代码
亲,您未登录哦! 登录 | 注册

用Delphi编写局域网中的聊天程序

打印文章

分享到:
Internet盛行的今天,网上聊天已成为一种时尚。同时,各单位已建成了自己的局域网;能否在局域网上实现聊天呢?可以,网上到处都有这种工具。当然,我们可以拥有自己版权的聊天工具。
  User Datagram Protocol (UDP)协议,是一种无连接协议。在Delphi中利用这种协议,可以轻松的编写出聊天程序,以下的程序,在Delphi 5+Pwin98中通过。
  打开Delphi,新建Application,放置以下几个控件:Panel1、Panel2,其属性如下:
FORM1.caption:=''聊天工具''
panel1.align:=albottom
panel2.align:=alclient
  然后,放置以下控件:Edit1,ListBox1,Memo1,Button1,Button2,BitBtn1, Nmudp1其主要控件的属性如下:
nmudp1.localport:=8888(可自定义)
nmudp1.remoteport:=8888(与localport相同)
源程序如下:
  unit main;
  interface
  uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Buttons, ExtCtrls, NMUDP, Menus, ComCtrls,WinSock; file://增加WinSock
  type
  TForm1 = class(TForm)
  NMUDP1: TNMUDP;
  Panel1: TPanel;
  Panel2: TPanel;
  Label1: TLabel;
  Edit1: TEdit;
  BitBtn1: TBitBtn;
  Memo1: TMemo;
  Panel3: TPanel;
  Panel4: TPanel;
  ListBox1: TListBox;
  Button1: TButton;
  Button2: TButton;
  procedure FormShow(Sender: TObject);
  procedure BitBtn1Click(Sender: TObject);
  procedure NMUDP1DataReceived(Sender: TComponent; NumberBytes: Integer;
                 FromIP: String; Port: Integer);
  procedure Edit1KeyPress(Sender: TObject; var Key: Char);
  procedure Button1Click(Sender: TObject);
  procedure Button2Click(Sender: TObject);
  private
   { Private declarations }
  public
   { Public declarations }
  end;
  var
  Form1: TForm1;
  ComputerName: array[0..127] of Char;
  implementation
  {$R *.DFM}
  procedure TForm1.FormShow(Sender: TObject);
  var
   sz: dword;
  begin
   sz := SizeOf(Computername);
   GetComputerName(ComputerName, sz);//得到本机的标识
   ListBox1.Items.Clear;
   ListBox1.Items.Add(''大家'');//在网友清单中,增加"大家"和
   ListBox1.Items.Add(ComputerName);//本机名称
   ListBox1.ItemIndex:=0;
  end;
  procedure TForm1.BitBtn1Click(Sender: TObject);
  var
   MyStream: TMemoryStream;
   TmpStr: String;
   i:integer;
  Begin
   if Edit1.Text<>'''' then file://如果所说的内容不为空,则发送。
    begin
     NMUDP1.ReportLevel := Status_Basic;
     NMUDP1.RemotePort :=8888;//端口为:8888,可以自己定义,但必须与LocalPort相一致。
     if ListBox1.Items[ListBox1.ItemIndex]=ComputerName then
      Edit1.Text:=ComputerName+''自言自语道:''+Edit1.Text file://如果和自己对话.
     Else
      Edit1.Text:=ComputerName+''对''+ListBox1.Items[listbox1.itemindex]+''说:''+Edit1.Text;
      TmpStr :=Edit1.text;
      MyStream := TMemoryStream.Create;
      try
      MyStream.Write(TmpStr[1], Length(Edit1.Text));
      if ListBox1.ItemIndex=0 then
       begin
        for i:=1 to ListBox1.Items.Count-1 do file://如果选择"大家",则对所有的网友发送信息
          begin
            NMUDP1.RemoteHost :=ListBox1.Items[i];//远程主机的名称或地址.
            NMUDP1.SendStream(MyStream);//发送信息.
        End;
      end
      else 如果私聊
       begin
        NMUDP1.RemoteHost :=ListBox1.Items[ListBox1.itemindex]; file://仅对所选中的网友.
        NMUDP1.SendStream(MyStream);
       End;
      finally
      MyStream.Free;
     end;
     Edit1.Text:='''';
     Edit1.SetFocus;
    end else
    Edit1.SetFocus;
    end;
procedure TForm1.NMUDP1DataReceived(Sender: TComponent;
    NumberBytes: Integer; FromIP: String; Port: Integer);
    var
     MyStream: TMemoryStream;
     TmpStr: String;
    begin
      MyStream := TMemoryStream.Create;
      try
      NMUDP1.ReadStream(MyStream);
      SetLength(TmpStr,NumberBytes);
      MyStream.Read(TmpStr[1],NumberBytes);
      Memo1.Lines.Add(TmpStr); file://显示对话的内容.
      finally
      MyStream.Free;
     end;
    end;
   procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
   var
    MyStream: TMemoryStream;
    TmpStr: String;
    i:integer;
   Begin
    if (key=#13) and (Edit1.Text<>'''') then file://如果所说的内容不为空,且最后一个按键为"Enter",则发送。
     begin
      NMUDP1.ReportLevel := Status_Basic;
      NMUDP1.RemotePort :=8888;
      if ListBox1.Items[ListBox1.ItemIndex]=ComputerName then
        Edit1.Text:=ComputerName+''自言自语道:''+Edit1.Text
      else
        Edit1.Text:=ComputerName+''对''+ListBox1.Items[listbox1.itemindex]+''说:''+Edit1.Text;
        TmpStr :=Edit1.text;
        MyStream := TMemoryStream.Create;
        try
         MyStream.Write(TmpStr[1], Length(Edit1.Text));
         if ListBox1.ItemIndex=0 then
          begin
           for i:=1 to ListBox1.Items.Count-1 do
            begin
             NMUDP1.RemoteHost :=ListBox1.Items[i];
             NMUDP1.SendStream(MyStream);
            end;
          end
          else
           begin
            NMUDP1.RemoteHost :=ListBox1.Items[ListBox1.itemindex];
            NMUDP1.SendStream(MyStream);
           end;
           finally
           MyStream.Free;
           end;
           Edit1.Text:='''';
           edit1.SetFocus;
          end else
           Edit1.SetFocus;
          end;
    procedure TForm1.Button1Click(Sender: TObject);
    var
     InputString:String;
     begin file://增加网友,输入的可以是IP地址或计算机名称。
     InputString:=InputBox(''增加人员'', ''IP地址或计算机名'', '''');
     if Inputstring<>'''' then ListBox1.Items.Add(Inputstring);
      ListBox1.ItemIndex:=0;
     end;
  procedure TForm1.Button2Click(Sender: TObject);
   begin file://删除当前选中的网友,但"大家"不能被删除.
    if ListBox1.ItemIndex<>0 then ListBox1.Items.Delete(ListBox1.ItemIndex);
   end;
  end.
  这样,一个简单的聊天工具就做好了,只要双方同时运行本程序,且将对方的计算机名称或IP地址加入到网友中即可实现实时聊天了,一个属于自己版权的聊天程序,就这样编写成功了。当然,你可以增加更多的内容,使程序更加的完善,以求更多的功能。

本栏文章均来自于互联网,版权归原作者和各发布网站所有,本站收集这些文章仅供学习参考之用。任何人都不能将这些文章用于商业或者其他目的。( Pfan.cn )

编程爱好者论坛

本栏最新文章