用Delphi编写局域网中的UDP聊天程序 (收藏)

原创 2004年07月06日 09:44:00


用Delphi编写局域网中的UDP聊天程序 
    Internet盛行的今天,网上聊天已成为一种时尚。同时,各单位已建成了自己的局域网;能否在局域网上实现聊天呢?可以,网上到处都有这种工具。当然,我们可以拥有自己版权的聊天工具。
  User Datagram Protocol (UDP)协议,是一种无连接协议。在Delphi中利用这种协议,可以轻松的编写出聊天程序,以下的程序,在Delphi 5+Pwin98中通过。
  打开Delphi,新建Application
放置以下几个控件:Panel1、Panel2,其属性如下:
  然后,放置以下控件:
Edit1
ListBox1
Memo1
Button1
Button2
BitBtn1
Nmudp1
    其主要控件的属性如下:
  各主要控件的功能如下:
现在的界面如下:
源程序如下:
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(ComputerNamesz);//得到本机的标识
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 begin file://如果选择”大家”,则对所有的网友发送信息
         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(TmpStrNumberBytes);
  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地址加入到网友中即可实现实时聊天了一个属于自己版权的聊天程序,就这样编写成功了。程序运行时,自动加入两个网友:”大家”和本地计算机名称.当然,你可以增加更多的内容,使程序更加的完善,以求更多的功能。

 

基于UDP的P2P小Demo (穿透NAT)delphi源码含Server和Client端

  • 2007年06月21日 12:08
  • 558KB
  • 下载

局域网发送文件的源代码(idUDPserver,idUDPClient)

===============服务端================unit Unit1;interfaceuses  Windows, Messages, SysUtils, Variants, C...
  • lee576
  • lee576
  • 2007年11月13日 17:47
  • 3747

Java使用UDP协议编写聊天程序

一个窗口的聊天程序
  • hoho_12
  • hoho_12
  • 2016年05月04日 21:58
  • 2282

一个简单的基于UDP字符界面的聊天应用程序(C/C++)

编写一个简单的基于字符界面的聊天应用程序         基于聊天的应用程序软件通常用会采用基于UDP的应用协议来实现,因为UDP不需要建立连接,而且没有数据确认和数据重传的机制,所以实时性较高。在聊...
  • chaoyuan899
  • chaoyuan899
  • 2013年04月24日 21:25
  • 3166

UDP打洞相关经验

几年前做过一个简单的nat 打洞的项目, 当时自己做了个简单的总结。 希望对你有些帮助。 p2p有很多种, 有些是利用supernode, 有些是nat 打洞, 有些是两者结合。 下面说的p2p专指...
  • softmanfly
  • softmanfly
  • 2013年10月05日 11:30
  • 2085

UDP打洞相关经验

几年前做过一个简单的nat 打洞的项目, 当时自己做了个简单的总结。 希望对你有些帮助。 p2p有很多种, 有些是利用supernode, 有些是nat 打洞, 有些是两者结合。 下面说的p2p专指...
  • softmanfly
  • softmanfly
  • 2013年10月05日 11:30
  • 2085

基于UDP的局域网聊天的系统原理

①主要用到的知识:线程、Socket类、ServerSocket类、UDP协议 ②线程:线程是进程的一个实体,除了本身运行占用很少的资源外,不占用系统资源。统一进程下的线程可以共享进程所拥有的全部资...
  • hjty99
  • hjty99
  • 2015年09月28日 00:04
  • 932

基于UDP协议的局域网网络聊天工具

/* * 本程序实现了基于UDP协议的局域网网络聊天工具。 * 参考网上的源码,发现一个calss就可以搞定。 * ChatFrame类创建窗口,包含JTextField和TextArea。 * 前者...
  • u012168222
  • u012168222
  • 2014年06月09日 15:18
  • 693

c实现非常简单的局域网聊天程序

毕业两年,学的东西都忘得差不多了。公司加班无聊,重温了一下UDP。一个局域网聊天程序。有诸多漏洞,练手为主。附上代码 // Sock.cpp : Defines the entry point fo...
  • rtwangdaobin123
  • rtwangdaobin123
  • 2012年06月08日 22:39
  • 512

Delphi用Socket IP/UDP局域网广播

 A类互联网网址: 7位网络号          24位主机号               01111111.11111111.11111111.11111111 --->01111111 = 127...
  • aroc_lo
  • aroc_lo
  • 2009年11月26日 13:48
  • 3199
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用Delphi编写局域网中的UDP聊天程序 (收藏)
举报原因:
原因补充:

(最多只允许输入30个字)