asp毕业设计——基于Delphi+udp+UDP的基于局域网的信息收发系统设计与实现(毕业论文+程序源码)——信息收发系统

基于Delphi+udp+UDP的基于局域网的信息收发系统设计与实现(毕业论文+程序源码)

大家好,今天给大家介绍基于Delphi+udp+UDP的基于局域网的信息收发系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦。需要下载开题报告PPT模板及论文答辩PPT模板等的小伙伴,可以进入我的博客主页查看左侧最下面栏目中的自助下载方法哦

文章目录:

1、项目简介

  1. 本课题设计主要针对局域网通讯而开发设计的,采用的是C/S构架,利用Delphi编程工具来实现单播、广播以及在线用户显示和查看历史记录的功能,并借助一些网络通讯组件,成功的实现了在局域网上的即时通讯。本论文共分为六部分。第一部分是课题的背景及研究意义;第二部分是所运用的理论基础知识;第三部分是本系统的需求分析;第四部分是系统结构和模块设计;第五部是实施和测试情况;最后是本设计的结论总结及部分参考文献。

2、资源详情

项目难度:中等难度
适用场景:相关题目的毕业设计
配套论文字数:8945个字28页
包含内容:整套源码+完整毕业论文


3、关键词:

即时通讯;C/S构架;单播;广播;历史记录

4、毕设简介

提示:以下为毕业论文的简略介绍,项目源码及完整毕业论文下载地址见文末。

1 引言
1.1 课题的背景
省略

1.2 国内外研究现状
省略

1.3 本课题研究的意义
随着现代通讯技术不断的发展,即时通讯技术也有飞速的发展,它是一种使人们能在网上识别在线用户并与他们实时交换消息的技术,被很多人称为电子邮件发明以来最酷的在线通讯方式。但是为了提高通讯的质量,很多企业在网络上进行即时通讯时一般都不会采用Internet上的即时通讯软件,如QQ、MSN、OICQ等。因此本课题主要是研究基于局域网的信息收发系统的设计与实现,希望能通开发设计的局域网通讯软件来方便在内部网络上的信息交流,这样不紧提高了通讯的质量,还能有效的防护在互连网上带来的攻击,对于那些大中型企业来说更是需要这样的一个自己内部的即时通讯工具,避免带来工作效率上不去;病毒及木马的感染率增大;远程服务器连接时过多的浪费网络资源;互连网由于某种原因而断开时造成通讯中断等问题。

2 理论基础
2.1 C/S软件架构技术
C/S(Client/Server)结构,即大家熟知的客户机和服务器结构。它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。目前大多数应用软件系统都是Client/Server形式的两层结构,由于现在的软件应用系统正在向分布式的Web应用发展,Web和Client/Server应用都可以进行同样的业务处理,应用不同的模块共享逻辑组件;因此,内部的和外部的用户都可以访问新的和现有的应用系统,通过现有应用系统中的逻辑可以扩展出新的应用系统。这也就是目前应用系统的发展方向。

传统的C/S体系结构虽然采用的是开放模式,但这只是系统开发一级的开放性,在特定的应用中无论是Client端还是Server端都还需要特定的软件支持。由于没能提供用户真正期望的开放环境,C/S结构的软件需要针对不同的操作系统系统开发不同版本的软件,加之产品的更新换代十分快,已经很难适应百台电脑以上局域网用户同时使用。

在这里插入图片描述

图1 客户机/服务器计算结构
2.2 用户数据报协议(UDP)
用户数据报协议(UDP)是ISO参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。UDP协议基本上是IP协议与上层协议的接口。UDP协议适用端口分辨运行在同一台设备上的多个应用程序。

由于大多数网络应用程序都在同一台机器上运行,计算机上必须能够确保目的地机器上的软件程序能从源地址机器处获得数据包,以及源计算机能收到正确的回复。这是通过使用UDP的“端口号”完成的。源端口号标识了请求域名服务的本地机的应用程序,同时需要将所有由目的站生成的响应包都指定到源主机的这个端口上。与TCP不同,UDP并不提供对IP协议的可靠机制、流控制以及错误恢复功能等。由于UDP比较简单,UDP头包含很少的字节,比TCP负载消耗少,所以UDP适用于不需要TCP可靠机制的情形,比如,当高层协议或应用程序提供错误和流控制功能的时候。UDP是传输层协议,服务于很多知名应用层协议,包括网络文件系统(NFS)、简单网络管理协议(SNMP)、域名系统(DNS)以及简单文件传输系统(TFTP)。

2.3 单播(Unicast)
单播(Unicast)指网络中从源向目的地转发单播流量的过程。单播流量地址唯一。单播方式下,只有一个发送方和一个接收方。与之比较,组播是指单个发送方对应一组选定接收方的一种通信,任意播是指任意发送方对应一组较为接近的接收方间的一种通信。早期的点对点通信含义类似于单播。

单播传输是 LANs 传输中的主要使用方式。所有 LANs(如以太网)和 IP 网络都支持单播传输模式,并且大多数用户都了解标准单播应用程序,如:http、smtp、ftp 和 telnet ― 都作为 TCP 传输协议。新版本的网际协议第六版(IPv6)支持单播同时也支持任意播和组播类型。许多路由选择协议如路由选择信息协议(RIP)和开放最短路径优先(OSPF),都支持高效 Internet 单播路由选择过程。

而IPv6 支持单播(Unicast)、组播(Multicast)和任意播(Anycast)三种类型。IPv6 中没有关于广播(Broadcast)的具体划分,而是作为组播的一个典型类型。
在这里插入图片描述

图2 单播物理结构图
2.4 广播(Broadcast)
网络广播是指一个节点同时向相同域中的其它所有节点传输数据包的过程。组播是一种特殊的广播,其中一组请求收听的选定用户将收到广播。广播传输通常在局域网(如以太网)中进行,但有时也发生在虚拟局域网(VLAN)中。IPv6 支持单播(Unicast)、组播(Multicast)以及任意播(Anycast)三种类型,IPv6 中没有关于广播(Broadcast)的具体划分,而是作为组播的一个典型。

生成广播信息的应用程序包括地址解析协议(ARP)。通过该协议,主机发送一个地址解析查询到局域网中的所有计算机上,以实现网络 IP 地址的分配。有些路由选择协议,如RIP,主要用于支持网络设备“Advertise”网络服务。

网络广播中涉及以下重要概念:
广播域(Broadcast Domain):这是一个限定区域,其中的所有设备都可以共享信息。换句话说,与网络相连,且负责接收广播的所有设备都是同一广播域的一部分。在一个共享以太网中,工作站通过共享媒体将帧广播到其它所有节点。其它节点收听广播,只接收寻址到它们的帧。因此,共享以太网中的所有节点都属于同一广播域。此外通过虚拟局域网技术可以创建一个虚拟广播域。

广播地址(Broadcast Address):这是一个特殊地址,当数据包可以寻址到该地址时,可以帮助所有设备打开和处理信息。例如,MAC 地址,格式为 1xFFFFFFFF 是一种广播地址;IP 地址255.255.255.255是通用广播地址。任何设备都将打开寻址到广播地址的信息,并将它们传送到下一个工作站。

广播风暴(Broadcast Storm):当主机系统响应一个在网上不断循环的广播数据包或者试图响应一个没有应答的系统时就会发生广播风暴。随着网络数据包数量的增加,广播风暴可能会引起网络拥塞问题。为防止广播风暴的发生,需要细心配置网络以阻止非法广播信息的进入。
在这里插入图片描述

图3 广播物理结构图
3 需求分析
3.1 现行业务系统描述
随着计算机网络日新月异的发展,人们的交流方式越来越多,传统的交流方式如:信件、电报、电话等已经难以满足人们的交流要求,在互联网上即时的和好友取得联系,已经成为当今社会人们主流的联系方式。两台计算机之间进行即时通讯、发送文件等交流方式已经成为时代的潮流。因此出现了QQ、UC等即时通讯工具。这些即时通讯业务属于基础语音业务外的数据增值类业务,从范畴来讲属于“消息类”业务,本质是完成对“文字、声音、图像”信息的传递。同属于消息类的业务还有短信、彩信等,他们之间都存在一定程度的替代性,同时又各有长短。但不会成为那些大中型企业内部的主要通讯工具,在企业中要求很简单,能确保快速正常的即时通讯,还要具有很好的安全性,这样才能提高工作效率,增加企业的效益。

3.2 现行系统存在的主要问题分析
目前,像QQ、UC等即时通讯工具虽然方便、实用,但是,娱乐功能太多,有很多吸引人的娱乐功能,从一定程度上来说,是一种娱乐工具,不能作为用于作为即时通讯、文件共享的专用工具。并且现在用于实现单一的即时通讯、文件共享的软件真的实在太少,因此不能为那些大中型企业所使用,而且在现行的系统中主要的问题是:一、在即时通讯系统中由于防火墙、网络速度等原因难以建立或者速度很慢,IM服务器还提供消息中转服务,即时消息全部先发送到IM服务器,还要再由服务器转发给对方,所以连接时过多的浪费了网络资源,并且在服务器忙或与服务器无法连接时,浪费过多时间用于和服务器建立连接;二、即时通讯工具始终是通过互连网的服务器来传输的,正是这样所以更有可能会带来遭遇到网络上的许多攻击,如木马,蠕虫等。为企业中的信息交流带来了很大的安全性问题。

3.3 提出解决方案
根据企业在内部网络上信息交流的需求,所以本课题就主要针对内部的网络来设计这样的一个即时通讯系统,本系统是在基于局域网的在IM客户端和IM服务器之间通讯采用的UDP协议和C/S软件构架技术上开发的通讯工具,它在近程的即时通讯时彻底的脱离了远程的服务器,不通过远程服务器来完成实现通讯,避免了和远程服务器连接时过多的浪费网络资源。并且避免了服务器忙或与服务器无法连接时浪费过多时间用于和服务器建立连接,同时也为内网服务增强了许多的安全性,彻底的将通讯工具从互连网上搬到内网中来,这样一来就不会受到来自互连网的攻击了。这种系统主要是为了方便了大中型企业在内部即时通讯要求,从而进一步提高工作效率,增加企业的效益。

4 系统设计
4.1 系统总体架构
本系统主要是采用C/S结构,并且每个客户端也是作为服务器端的,当系统发送信息给局域网的用户,主要由单播模块和广播模块来实现,而其中的单播模块和用户信息模块是具有依赖性的,在接收信息的时候又有两个模块来完成,一是信息接收的模块,另一个是信息查看的模块。

由此可以看出本系统主要分为两大部分模块:发送模块和接收模块。发送模块:单播模块,广播模块,用户信息模块,信息记录模块接收模块:接收信息模块,查看信息模块
有了以上的了解了那让我们来看看系统的架构图:

在这里插入图片描述

图4 系统架构图
4.2 界面设计
为了方便用户的操作,我采用比较简单的界面设计,主界面包括广播按钮、发送按钮、刷新按钮、在线用户显示框、信息输入窗体。其中广播按钮是将信息窗体中的内容发送到所有的用户;发送按钮是将信息窗体中的内容发送到指定的用户;在线用户显示框中选取指定的用户和查看用户的信息;刷新是重载用户列表。

在这里插入图片描述

图5 主界面
当有信息传过来时将自动弹出一个信息接收的窗体,窗体包括查看按钮和关闭按钮还有一个显示对方用户的区域,他们分别是用来打开并查看信息或是不想查看而关闭的作用。
在这里插入图片描述

图6 信息接收界面
如过你在图6中点击了查看按钮,那么将会弹到显示信息查看的窗体上,在文本区则会显示对方传送过来的信息内容,在查看了之后有个关闭按钮,用来结束对话框,便可以回到图5的界面了。
在这里插入图片描述

图7 信息查看界面
在历史记录的窗体中点击记录文件按钮来选择保存的路径,将会自动生成一个文本文件来对通讯记录进行保存。
在这里插入图片描述

图8 历史记录

4.3 系统功能模块设计
4.3.1 网络组件
UDP协议由TCP协议衍生而来。TCP用于确保点对点的连接,而UDP并不保证发送的数据一定到达,也不表明数据报的传输成功或失败。

本系统设计使用的是TIdUDPClient和TIdUDPServer两个用户数据报(UDP)组件,首先创建Delphi工程。然后向工程组再添加一个工程。把一个工程作为客户,另一个作为服务器。为连接到UDP服务器,需要一个TIdUDPClient组件。用来表示服务器的IP地址和端口号。由于UDP是无连接的,因此在UDP的接口方法中不包括Connect方法。要使用Internet Direct实现的组件,只需使用Send向给定的IP地址和端口号广播一个命令字符串。

其中我为IP地址和端口号的设置分别为127.0.0.1和9000。服务器是作为应用程序实现的,它对客户程序发出的一个简单的命令集进行响应。为实现服务器,程序将监听DefaultPort端口上的广播,并将TIdUDPServer.Active设置为True。

下面是我对TIdUDPClient和TIdUDPServer组件的设置图:
在这里插入图片描述

图9 TIdUDPClient组件设置
在这里插入图片描述

图10 TIdUDPServer组件设置

4.3.2 用户信息显示功能
为了方便用户选取单个用户进行信息发送和查看在线用户的信息,所以设计了一个ListView来进行显示如图5,在ListView中包括了用户名、工作组、IP地址。当有用户打开本系统的时候将会向局域网中的所有用户发送一个握手信息来获取网络中的在线用户信息并添加到列表中显示出来,同时也把自己的网络资源信息发送给对方,使自己被添加到其他用户的列表中。

其中分别要对网络中的所有的用户名、工作组、IP地址进行获取,下面来看一下对于获取这些网络资源的代码部分。

  1. 用户名获取代码如下:
Function tform1.GetUsers( GroupName : string;List : TStringList) : Boolean;
type TNetResourceArray = ^TNetResource;         //网络类型的数组
Var
NetResource: TNetResource;  Buf: Pointer; Count,BufSize,Res: DWord; 
lphEnum: THandle; Ind: Integer; Temp: TNetResourceArray; TmpStr:String;
Begin
 Result := False;
FillChar(NetResource, SizeOf(NetResource), 0);          //初始化网络层次信息
NetResource.lpRemoteName := @GroupName[1];              //指定工作组名称
NetResource.dwDisplayType := RESOURCEDISPLAYTYPE_SERVER;//类型为服务器(工作组)
NetResource.dwUsage := RESOURCEUSAGE_CONTAINER;         //已连接机器
NetResource.dwScope := RESOURCETYPE_DISK;               //列举文件资源信息

//获取指定工作组的网络资源句柄
 Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
 RESOURCEUSAGE_CONTAINER, @NetResource,lphEnum);

 If Res <> NO_ERROR then Exit; //执行失败
 While True Do//列举指定工作组的网络资源

Begin
 Count := $FFFFFFFF;           //不限资源数目
 BufSize := 8192;             //缓冲区大小设置为8K
 GetMem(Buf, BufSize);        //申请内存,用于获取工作组信息

//获取计算机名称
Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);

 If Res = ERROR_NO_MORE_ITEMS then break;   //资源列举完毕
   If (Res <> NO_ERROR) then Exit;          //执行失败
   Temp := TNetResourceArray(Buf);
   For Ind := 0 to Count - 1 do            //列举工作组的计算机名称

Begin
//获取工作组的计算机名称
    tmpStr:=Temp.lpRemoteName;
Delete(tmpstr,1,2);
Form1.ListBox1.Items.Add(tmpStr);
list.Add(tmpstr);
Inc(Temp);
  end;
end;

 Res := WNetCloseEnum(lphEnum);//关闭一次列举
 If Res <> NO_ERROR then exit;//执行失败
Result := True;
FreeMem(Buf);
end;
  1. 工作组获取代码如下:
var //显示所有工作组的名称
NetResource : TNetResource;
Buf : Pointer;
Count,BufSize,Res : DWORD;   //一个无符号的,占四个字节(32)的整型//句柄类型
lphEnum : THandle;  
p : TNetResourceArray;i,j : SmallInt;
NetworkTypeList : TList;  //返回局域网中的工作组名称

…………
//列出一个网络类型中的所有工作组名称
begin
NetResource := TNetResource(NetworkTypeList.Items[J]^);//网络类型信息
//获取某个网络类型的文件资源的句柄,NetResource为网络类型信息,lphEnum为返回名柄
Res:=WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,RESOURCEUSAGE_CONTAINER, @NetResource,lphEnum);
if Res <> NO_ERROR then break;//执行失败
while true do//列举一个网络类型的所有工作组的信息
begin
Count := $FFFFFFFF;             //不限资源数目
BufSize := 8192;                //缓冲区大小设置为8K
GetMem(Buf, BufSize);           //申请内存,用于获取工作组信息

//获取一个网络类型的文件资源信息
Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
if ( Res = ERROR_NO_MORE_ITEMS ) //资源列举完毕
or (Res <> NO_ERROR) //执行失败 
then break;
P := TNetResourceArray(Buf);
for I := 0 to Count - 1 do  //列举各个工作组的信息
begin
List.Add( StrPAS( P^.lpRemoteName ));//取得一个工作组的名称
Inc(P);
end; 
end;

Res := WNetCloseEnum(lphEnum);   //关闭一次列举
if Res <> NO_ERROR then break;   //执行失败
end;
Result := True;
FreeMem(Buf);
NetworkTypeList.Destroy;
end;
  1. IP地址获取代码如下:
procedure TForm1.ServerUDPRead(Sender: TObject; AData: TStream;ABinding: TIdSocketHandle);
var 
readbuf:array[0..2030]of char;
msg,head,recvip,recvname,recvworkgroup,recvmsg,memo:string; 
recvport:integer;
f:textfile;

begin
ZeroMemory(@readbuf[0],2030);
adata.Read(readbuf,sizeof(readbuf));
msg:=Trim(String(Pchar(@Readbuf[0])));

//memo1.Lines.Add(msg);
head:=trim(copy(msg,1,headlen));

//添加对方IP  1.返回对方IP 2. 发出Hand握手信息
if head='LOGIN' then 

begin
recvip:=abinding.PeerIP;
recvport:=9000;

// memo1.Lines.Add('login recv'+recvip+inttostr(recvport));

recvname:=copy(msg,headlen+1,namelen);
recvworkgroup:=copy(msg,headlen+namelen+1,length(msg));
adduser(recvname,recvworkgroup,recvip,recvport);
handdata(recvip,myname,myworkgroup,recvport);
end;

//添加对方返回的自己的ip (对比)
if head='REVLOG'then       

begin

//  memo1.Lines.Add('revlog recv');

RECVPORT:=strtoint(copy(msg,headlen+1,portlen));
recvip:=copy(msg,headlen+portlen+1,iplen);
recvlog(recvip,recvport);
end;
//处理握手信息 添加对方ip 返回对方ip
if head='HAND'then      

Begin
// memo1.Lines.Add('hand recv');

RECVNAME:=COPY(msg,headlen+1,namelen);
recvworkgroup:=copy(msg,headlen+namelen+1,workglen);
recvip:=abinding.PeerIP;
recvport:=9000;
recvp2pdata(recvip,recvname,recvworkgroup,recvport);
end;

//处理握手信息 添加对方ip 返回对方ip
if head='HAND'then      

Begin
// memo1.Lines.Add('hand recv');

RECVNAME:=COPY(msg,headlen+1,namelen);
recvworkgroup:=copy(msg,headlen+namelen+1,workglen);
recvip:=abinding.PeerIP;
recvport:=9000;
recvp2pdata(recvip,recvname,recvworkgroup,recvport);
end;

4.3.3 局域网内实现单播功能
在本设计中单播发送的按钮为BitBtn2,主要是通过IdUDPServer和IdUDPClient组件来编写的,由client.SendBuffer语句来发送的,主要是对局域网内部的同一工作组用户发送信息。
下面是发送按钮的代码部分:

procedure TForm1.BitBtn2Click(Sender: TObject);
var 
//myinfobuf:array[0..1023]of char;
_ToPORT:integer;
chatinfo,_ToIP,savelog:string;
chatinfobuf:array[0..2030]of char;
tempItem:TListItem;
f:textfile;

begin
       tempItem:=UserList.Selected;                   //用户列表选择
  if (not assigned(tempItem)) or (tempItem=nil) then
begin
     MessageBox(self.Handle ,'请选择消息接收者!','提示',0);  //调用窗口
     exit;
  end;
  _ToIp:=tempItem.SubItems[1];     //获取通用对话框文件名和导出仅选中的记录
  _ToPORT:=9000;
  chatinfo:=format('%-6s%-255s%-1024s',['CHAT',myname,memo1.Lines.Text]);
  strpcopy(chatinfobuf,chatinfo);
  //memo1.Lines.Add(strpas(myinfobuf));

  client.SendBuffer (_toip,_toport,chatinfobuf,sizeof(chatinfobuf));
end;

由于是单播所以需要指定用户,而用户是由ListView中显示的,则要对其进行显示并能选取,通过客服端来让主机服务器响应,实现代码主要如下:

Function tform1.recvp2pdata(recvip,recvname,recvworkgroup:string;recvport:integer):string;

var 
minfobuf:array[0..1023]of char;
minfo:string; 
tempitem:tlistitem;  
i,j:integer;

begin
   j:=0;
  for i:=0 to userlist.Items.Count-1 do
begin
  if userlist.Items.Item[i].Caption<>RECVNAME then
    inc(j,1);
  if j=userlist.Items.Count then

begin
tempItem:=UserList.Items.Add ;
tempItem.Caption:=RECVNAME;

if form5.checkbox1.Checked 
then tempItem.SubItems.Add(recvworkgroup);

if form5.CheckBox3.Checked 
then tempItem.SubItems.Add(RECVNAME);
if form5.CheckBox4.Checked 
then tempItem.SubItems.Add(recvip);
end

else 
exit; 
end;

  minfo:=format('%-6s%-4d%-255s',['REVLOG',recvport,recvip]); //返回对方IP port
  strpcopy(minfobuf,minfo);
  server.SendBuffer(recvip,recvport,minfobuf,sizeof(minfobuf));
  Label2.Caption:=INTTOSTR(USERLIST.Items.Count);
end;

procedure tform1.adduser(revname,revworkgroup,revip:string;revport:integer);
var 
tempitem:tlistitem;

begin
  tempItem:=UserList.Items.Add ;
  tempItem.Caption:=revname;
if form5.checkbox1.Checked 
then tempItem.SubItems.Add(revworkgroup);
if form5.CheckBox3.Checked 
then tempItem.SubItems.Add(revname);
if form5.CheckBox4.Checked 
then tempItem.SubItems.Add(revip);

Label2.Caption:=INTTOSTR(USERLIST.Items.Count);
end;

procedure tform1.recvlog(recvip:string;recvport:integer);
var  tempitem:tlistitem; i,j:integer;

begin
for i:=0 to userlist.Items.Count-1 do

begin
if tempItem.Caption<>myname then inc(j,1);
if j=userlist.Items.Count then

begin
   tempItem:=UserList.Items.Add ;
   tempItem.Caption:=myname;

if form5.checkbox1.Checked 
then tempItem.SubItems.Add(myworkgroup);
if form5.CheckBox3.Checked 
then tempItem.SubItems.Add(myname);
if form5.CheckBox4.Checked 
then tempItem.SubItems.Add(recvip);
end
else 
exit;
end;
 Label2.Caption:=INTTOSTR(USERLIST.Items.Count);
end;

IP地址进行显示;由工作组进行显示,最后连接到表Label2中去。

4.3.4 局域网内实现广播功能
在本设计中单播发送的按钮为BitBtn3,主要是通过IdUDPServer和IdUDPClient组件来编写的,主要是使用了client.Broadcast来对信息进行发送的,在发送时将会把信息发送给在局域网内部的所有用户包括自己。
下面是发送按钮的代码部分:

procedure TForm1.BitBtn3Click(Sender: TObject);

 var
 chatinfo:string;
 chatinfobuf:array[0..2030]of char;
 f:textfile;

begin
     chatinfo:=format('%-6s%-255s%-1024s',['CHAT',myname,memo1.Lines.Text]);
     strpcopy(chatinfobuf,chatinfo);
     client.Broadcast(chatinfobuf,9000);

end;

4.3.5 历史信息记录功能
为了能让用户对历史的信息进行查看,所以本设计中包含了一个对历史信息进行记录的功能,主要是创建一个记事本文件对信息进行复制保存,以下就是历史信息记录的代码:

procedure Tdetailform.RecorBBtnClick(Sender: TObject);
begin
    if  SavRecorDia.Execute  then
  begin
     RecorEd.Text:=SavRecorDia.FileName;
  end;
end;
procedure Tdetailform.Button3Click(Sender: TObject);
var F:textfile;
begin
     showmessage(RecorEd.Text);
     assignfile(f,RecorEd.Text);
     rewrite(F);
     closefile(F);
end;

…………
begin
    if detailform.RecorEd.Text<>'' then
begin
    Assignfile(f,detailform.RecorEd.Text);  
if fileexists(detailform.RecorEd.Text)then append(f)
  else rewrite(F);
    writeln(f,'=====================================');
    writeln(f,'发往:'+_ToIp);
    if SealCheckBox.Checked then
    writeln(f,'时间:'+datetostr(now)+timetostr(now))
  else
    writeln(f,'时间:'+datetostr(now)+timetostr(now));
    writeln(f,'-------------------------------------');
    writeln(f,SRMemo.Lines.Text);
    writeln(f,'=====================================');
    closefile(f);
end;
end;

5 系统实施及测试
5.1 实施概况
本设计是基于局域网内采用C/S结构的即时通信软件,其主要实现的是单播和广播功能,还包含了显示用户信息、查看历史信息等辅助功能。本设计是在是Microsoft Windows XP系统上利用编程软件开发的,然后再组建的局域网中来进行测试和调试工作,所以最少会用到两台或两台以上的电脑并由交换机组成一个小型的局域网,考虑到一些系统兼容性的问题,所以在内部网络上的每台计算机上都用的是相同的操作系统,在网络配置方面也是相同的方式。对于编程软件的选择主要是采用Delphi7来编写和编译程序的,因为考虑到Delphi是具有可视化的一个编程环境, Delphi它提供了500多个可供使用的构件,利用这些部件可以快速地构造出应用系统。也可以根据自己的需要修改部件或用Delphi本身编写自己的部件,能提供方便、快捷的Windows应用程序开发环境,本程序也基本是借助与那些组件来编写的。

5.2 测试方案
本程序在Windows XP操作系统下,使用Borland Delphi 7企业版软件作为开发工具,利用Delphi7(企业版)集成开发环境中提供的网络通讯组件进行编程的,代码也是在这个开发环境中编译的,并在组建的局域网中进行系统测试的。
设计测试的是同在一个局域网中,先将编译好的程序复制到内部网络上的没台计算机上面,然后都将设计的系统打开运行,这是观察是否能显示所有的在线用户的信息,如果了防火墙之类的软件正在运行的话,很可能不能正常显示工作组、IP等信息,所以最好是关闭防火墙。如图11:
在这里插入图片描述

图11 显示在线用户
如果能显示出来用户的信息则在其中一台计算机上的信息窗体中输入好准备发送出去的信息“欢迎使用!”,如图12:
在这里插入图片描述

图12 输入发送信息
如果是想发送到整的网络就点击界面上的广播按钮,这时在所有的计算机上都会弹出一个接收的界面,如图13:
在这里插入图片描述

图13 接收界面
点击查看按钮则会弹到一个查看信息的界面上,上面会显示出刚才所发送的信息和来自于谁,如图14:
在这里插入图片描述

图14 查看界面
如果是想发送给网络中的其中一个用户就先选择要发送的对象再点击发送按钮,这时就只会在那个指定的用户那里弹出查看的界面了而其他用户则不会接收到发送来的信息。
要是想对通讯的内容进行记录,则在历史记录窗体上选择保存通讯记录的路径,点击确认按钮,便会在选择的路径里生成一个文本文件用来保存用户的通讯记录了,在点击托盘区图标选择查看记录,如图15:
在这里插入图片描述

图15 通讯记录界面
最后是退出,退出只能点击托盘区的图标来退出,当关闭了其中一个用户的时候,其他的用户列表中自动会将该用户的用户信息给删除,这表明此用户已经下线离开了。
5.3 测试结果
经过多次在局域网中进行测试,本设计的基本功能都在测试中得到了体现,下面就是我在整个测试的过程中得到的一些测试结果:

  1. 在局域网内能完整传输所发的信息,不会出现信息丢失或乱码等情况
  2. 在测试的时候如果开了防火墙很可能不能显示工作组,但并不会影响到信息的发送和接收
  3. 在发送广播信息时是对所有用户发送信息,包括自己也会收到广播信息
  4. 当进入系统后便能自动更新显示在线用户信息,用户下线时能在显示列表中也能自动删除此用户信息
  5. 能对用户在即时的通讯时的通讯信息进行记录,方便用户查看历史的通讯信息
  6. 通过测试还发现了用户只能进行文本格式即时的通讯,不能发送图片等格式的信息
  7. 在发送信息时没有能对信息进行加密后在发送

结 论
省略

参考文献
[1] 刘华.黑魔方 Delphi 基础教程[M].北京:清华大学出版社,2004.9。
[2] 飞思科技产品研发中心.Delphi 网络高级编程[M].北京:电子工业出版社,2002.1。
[3] 施新刚.Delphi 实效编程百例[M].北京:人民邮电出版社,2002.1。
[4] 鲍敏,吴昊.Delphi 网络高级编程[M].北京:人民邮电出版社,2001.7。
[5] 肖建.Delphi 6 编程基础[M].北京:清华大学出版社,2002.1。
[6] (美)W.Richars Stevens.TCP/IP详解 卷1:协议[M]. 北京:机械工业出版社,2005。
[7] (美)Paul Kimmel.Delphi 6 应用开发指南[M].北京:清华大学出版社,2002.1。

致 谢
省略


5、资源下载

本项目源码及完整论文如下,有需要的朋友可以点击进行下载。如果链接失效可点击下方卡片扫码自助下载。

序号毕业设计全套资源(点击下载)
本项目源码基于Delphi+udp+UDP的基于局域网的信息收发系统设计与实现(源码+文档)_CS架构_信息收发系统.zip
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
股票,证券等,用这个来发布行情数据,刷刷的。 UDP通信的优势 速度比TCP快。 UDP通信的缺点 一旦UDP包过大的话,也能正常工作。只是优势就丢失了。 idUdpClient 主要用于发送udp请求,在接收udp响应的时候是同步的,所以一定要设置超时,否则的话程序容易死。 idUpdServer 即能用于发送udp数据包,也能用于接收udp数据包。但是设计的主要目的还是用于收到udp数据包之后给于反馈。 UDP包的大小问题 资料1:以太网的MTU是1500字节,IP包头占20个字节,UDP首部占8个字节,也就是说实际数据应该小于1472字节. 资料2:鉴于Internet上的标准MTU值为576字节,所以我建议在进行Internet的UDP编程时.最好将UDP的数据长度控件在548字节(576-8-20)以内. 测试结果: 0-548字节:会完美的展现UDP协议的优势(速度刷刷的)。 大于1472字节以后的话,也可以正常执行。你会见识到什么叫做不可靠的信道(经过测试90%以上还是成功的,只是速度慢了很多)。 数据包大于2K速度明显变慢了;数据包大于3K,成功率60%到80%;数据包大于4k,成功率20%以下。 结论: 1.UDP协议还是比较可靠的。使用它能充分挖掘速度的潜力。通常大部分请求和相应都在548以下,小部分请求超过548。 2.548字节,可以存储274个汉字呢。比手机短信都长。你传什么那么大? 3.尤其是双方都在修改数据,需要实施数据实时同步的时候。修改量都比较小,用udp再合适不过了。 客户端的阻塞式响应不太理想 可以采用的办法是双方都开UDP服务器来接受。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

毕业设计方案专家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值