`
cloud21
  • 浏览: 396310 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

Delphi2010的Indy全接触之UDP篇

阅读更多
首先新建服务端。

  如下图所示建立工程:


代码如下:

unitServerUnit;
interface
uses
 Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,
 Dialogs,IdBaseComponent,IdComponent,IdUDPBase,IdUDPServer,StdCtrls,
 IdSocketHandle,IdGlobal;
type
 TServerForm=class(TForm)
  Label1:TLabel;
  Edit1:TEdit;
  Label2:TLabel;
  Edit2:TEdit;
  Label3:TLabel;
  Edit3:TEdit;
  IdUDPServer1:TIdUDPServer;
  procedureIdUDPServer1UDPRead(AThread:TIdUDPListenerThread;AData:TBytes;
   ABinding:TIdSocketHandle);
  procedureFormCreate(Sender:TObject);
 private
  {Privatedeclarations}
 public
  {Publicdeclarations}
 end;
var
 ServerForm:TServerForm;
implementation
{$R*.dfm}
procedureTServerForm.FormCreate(Sender:TObject);
begin
 IdUDPServer1.DefaultPort:=3030;
 IdUDPServer1.Active:=True;
 Edit1.ReadOnly:=True;
 Edit2.ReadOnly:=True;
 Edit3.ReadOnly:=True;
end;
procedureTServerForm.IdUDPServer1UDPRead(AThread:TIdUDPListenerThread;
 AData:TBytes;ABinding:TIdSocketHandle);
begin
 Edit1.Text:=ABinding.PeerIP;
 Edit2.Text:=IntToStr(ABinding.PeerPort);
 Edit3.Text:=BytesToString(AData);
 IdUDPServer1.Send(ABinding.PeerIP,ABinding.PeerPort,TimeToStr(Time)+'=>Serverreceivedthemessage!');
end;
end.


然后新建客户端如下图所示:

  注意:为了让客户端能实时监控服务端发回来的确定消息,使用了TTimer控件,Interval设置为250毫秒。



代码如下:

unitClientUnit;
interface
uses
 Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,
 Dialogs,StdCtrls,ExtCtrls,IdBaseComponent,IdComponent,IdUDPBase,
 IdUDPClient;
type
 TClientForm=class(TForm)
  Label1:TLabel;
  Edit1:TEdit;
  Button1:TButton;
  Label2:TLabel;
  Edit2:TEdit;
  IdUDPClient1:TIdUDPClient;
  Timer1:TTimer;
  procedureButton1Click(Sender:TObject);
  procedureFormCreate(Sender:TObject);
  procedureTimer1Timer(Sender:TObject);
 private
  {Privatedeclarations}
 public
  {Publicdeclarations}
 end;
var
 ClientForm:TClientForm;
implementation
{$R*.dfm}
procedureTClientForm.Button1Click(Sender:TObject);
begin
 IdUDPClient1.Broadcast(Edit1.Text,3030);
 Timer1.Enabled:=True;
end;
procedureTClientForm.FormCreate(Sender:TObject);
begin
 Timer1.Enabled:=False;
 Edit2.ReadOnly:=True;
end;
procedureTClientForm.Timer1Timer(Sender:TObject);
begin
 Edit2.Text:=IdUDPClient1.ReceiveString(-1);
 Timer1.Enabled:=False;
end;
end.


如此实现简单的UDP协议下局域网通讯。

  ===================================================

  但是很快我又发现,上面的代码在本机虽然能够正常执行,分别位于2台电脑时会发生无法接收服务器响应的现象。

  究其原因可能是客户程序用户界面“冻结”的缘故。

  于是在服务端和客户端都加上TIdAntiFreeze以解决上面发生的现象(尤其是客户端)。

  服务端:



客户端:



事实上,上述客户端的TTimer控件是完全没有必要使用的。

  当我们对IdUDPClient使用Broadcast方法后,一旦与服务端通讯成功,IdUDPClient自动会得到来自服务端的返回值。

  如果通讯失败,在IdUDPClient.ReceiveTimeout所设定的事件后终止响应,所以我们可以吧延迟事件稍微设长一点。

  于是客户端代码可以简单的写成:

unitClientUnit;
interface
uses
 Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,
 Dialogs,StdCtrls,ExtCtrls,IdBaseComponent,IdComponent,IdUDPBase,
 IdUDPClient,IdAntiFreezeBase,IdAntiFreeze;
type
 TClientForm=class(TForm)
  Label1:TLabel;
  Edit1:TEdit;
  Button1:TButton;
  Label2:TLabel;
  Edit2:TEdit;
  IdUDPClient1:TIdUDPClient;
  IdAntiFreeze1:TIdAntiFreeze;
  procedureButton1Click(Sender:TObject);
  procedureFormCreate(Sender:TObject);
 private
  {Privatedeclarations}
 public
  {Publicdeclarations}
 end;
var
 ClientForm:TClientForm;
implementation
{$R*.dfm}
procedureTClientForm.Button1Click(Sender:TObject);
begin
 IdUDPClient1.Broadcast(Edit1.Text,3030);
 Edit2.Text:=IdUDPClient1.ReceiveString(-1);
end;
procedureTClientForm.FormCreate(Sender:TObject);
begin
 IdUDPClient1.ReceiveTimeout:=5000;
 Edit2.ReadOnly:=True;
end;
end.


如此即可完成与服务端的通讯。

  =======================================================================

  关于网络中查找服务器主机的问题,似乎可以使用UDP广播的方式查找。

  先看代码:

unitClientUnit;
interface
uses
 Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,
 Dialogs,StdCtrls,ExtCtrls,IdBaseComponent,IdComponent,IdUDPBase,
 IdUDPClient,IdAntiFreezeBase,IdAntiFreeze;
type
 TClientForm=class(TForm)
  Label1:TLabel;
  Edit1:TEdit;
  Button1:TButton;
  Label2:TLabel;
  IdUDPClient1:TIdUDPClient;
  IdAntiFreeze1:TIdAntiFreeze;
  ListBox1:TListBox;
  Timer1:TTimer;
  procedureButton1Click(Sender:TObject);
  procedureFormCreate(Sender:TObject);
  procedureTimer1Timer(Sender:TObject);
 private
  {Privatedeclarations}
  varIpList:TStringList;
 public
  {Publicdeclarations}
 end;
var
 ClientForm:TClientForm;
implementation
{$R*.dfm}
procedureTClientForm.Button1Click(Sender:TObject);
begin
 IdUDPClient1.Broadcast(Edit1.Text,3030);
 ListBox1.Items.Add(IdUDPClient1.ReceiveString());
end;
procedureTClientForm.FormCreate(Sender:TObject);
begin
 IdUDPClient1.ReceiveTimeout:=10000;
 IpList:=TStringList.Create;
end;
procedureTClientForm.Timer1Timer(Sender:TObject);
varipaddr:string;
varI:Integer;
begin
 IdUDPClient1.BroadcastEnabled:=True;
 IdUDPClient1.Broadcast('SearchHost',3030);
 ipaddr:=IdUDPClient1.ReceiveString();
 ifIpList.IndexOf(ipaddr)=-1then
  IpList.Add(ipaddr);
 ListBox1.Clear;
 forI:=0toIpList.Count-1do
  ListBox1.Items.Add(IpList.Strings[I]);
end;
end.


这样在IpList中就会不断的有主机的IP地址被加入进来了。

  但是实际情况是这样的:

  由于使用了TTimer控件,我这里设置了Interval:5000,如果设置过小会因为线程大量占用而严重影响主程序正常工作,不知道有什么办法来解决这个问题。还有,当网络中没有服务器的任何响应时客户端也会出现假死现象,不知如何解决。
0
1
分享到:
评论

相关推荐

    indy10 UDP 收发结构体 for Delphi 2010

    Indy10 UDP收发结构体在Delphi 2010中的应用是一个关键的网络通信技术,主要用于构建基于UDP协议的高效、灵活的通信系统。本文将深入探讨 Indy10库如何在Delphi 2010环境中实现UDP通信,并讨论相关的核心结构体及其...

    delphi indy udp indy10.5.5_udp

    Delphi Indy UDP是用于在Delphi编程环境中实现UDP(用户数据报协议)网络通信的库。Indy(Internet Direct)是Delphi和C++Builder的一个组件集,它为开发人员提供了一套完整的网络协议栈,支持多种网络协议,包括TCP...

    delphi的Indy实现tcp和udp例子源

    Indy(Internet Direct)是Delphi中的一个组件库,为开发者提供了丰富的网络编程接口,支持TCP(传输控制协议)和UDP(用户数据报协议)等网络通信协议。 TCP是一种面向连接的、可靠的传输协议,它确保了数据包在...

    delphi2010 indy10.6.2 完成安装 支持TLS1.2

    Delphi 2010 Indy 10.6.2 是一个针对 Delphi 开发者的网络组件库,它经过更新以支持最新的传输层安全(TLS)协议版本1.2。这个版本的Indy是为了帮助开发者在他们的应用程序中实现更安全的网络通信,特别是在面临旧的...

    indy10 udp收发文件 for delphi2010

    indy10 for delphi2010环境。不使用结构体,先构建多个tbytes类型的子buf,借用内存流,连接多个子buf合成一个buf,用udp发出去。接收端根据所建的子buf的数据长度,借助流将adata中各个子buf分离出来,最后合成文件...

    Delphi2010 Indy10 ssl使用的两个动态库

    在Delphi 2010中使用Indy 10进行SSL通信时,开发者需要依赖两个重要的动态链接库(DLLs):libeay32.dll和ssleay32.dll。这两个动态库是OpenSSL库的一部分,OpenSSL是一个开源项目,提供了用于加密通信和安全套接层...

    delphi2010使用Indy组件实现http/https

    根据delphi2010中的indy组件的TIdHTTP类制作封装了类:THttpModule/THttpsModule,实现了方法get和post。https访问需要的2个动态链接库文件(libeay32.dll、ssleay32.dll)也打在包中了。代码文件已经在delphi2010中...

    Delphi 2010 indy10.5.5 文件传输示例

    在本文中,我们将深入探讨如何使用Delphi 2010和Indy 10.5.5库来实现一个简单的P2P(点对点)文件传输应用。Delphi是一款强大的面向对象的编程环境,而Indy则是一个功能丰富的网络组件套件,非常适合构建网络通信...

    Delphi7 indy组件 已编译的indy组件 Internet组件

    Indy(Internet Direct)是Delphi开发者常用的网络通信库,尤其在Delphi 7时代,它为开发跨平台的TCP/IP应用程序提供了强大的支持。这个压缩包包含的是已经编译好的Indy组件,可以直接添加到Delphi 7的库中使用,极...

    libeay32.dll ssleay32.dll Delphi2010 indy10 支持 TLS1.2

    为了使Delphi 2010的Indy 10支持TLS 1.2,通常需要更新或替换原有的OpenSSL库,这正是提供的"libeay32.dll"和"ssleay32.dll"文件的作用。它们可能包含了TLS 1.2所需的加密算法和函数实现,以确保Delphi 2010应用能够...

    delphi7 indy10.6.2网络开发必备工具

    《Delphi7 Indy10.6.2:网络开发利器详解》 在IT行业中,网络开发是至关重要的一环,尤其对于软件开发者来说,拥有一款高效、稳定的网络库至关重要。Delphi7 Indy10.6.2正是这样一个针对Delphi开发者的强大网络开发...

    indy10 UDP摄像头视频传输(delphi2010)

    indy10 ,使用DSPACK抓取摄像头图像,delphi2010环境。客户端发出视频请求,服务器端自动应答,开多线程,在线程中抓取图片后,采用JPEG压缩图片流,对图片流分包后,用Idudp发送出去。客户端组装流,合成jpg文件用...

    delphi7 indy10.2.3控件

    安装步骤:1、在D7的目录下,双击Borland Delphi7.msi文件。 2、在弹出的对话框中选“Modify”。 3、然后点“Next”,在接下来的对话框中,找到Indy,点“Do Not Install”。之后一路“Next”,最后完成,就卸载成功...

    delphi的indy实现udp打洞

    在Delphi中使用Indy实现UDP打洞,主要涉及以下几个步骤: 1. **理解UDP**:UDP(User Datagram Protocol)是无连接的传输层协议,相比TCP,它不保证数据包的顺序、完整性和可靠性,但具有低延迟和简单协议的优点,...

    indy10 for delphi7

    Indy 10 是一个广泛使用的网络组件套件,尤其在Delphi开发环境中,它为开发者提供了构建网络应用的强大工具。对于Delphi 7这样的较旧版本,Indy 10 提供了更新的网络协议支持,如HTTP、FTP、SMTP、IMAP等,以及SSL/...

    delphi7 indy9.zip

    delphi7 indy9 接口调用解决这2个问题(17个版本):“cound not load ssl library 、 error connecting with ssl”

    Delphi之UDPSocket实例开发

    在Delphi中,我们可以使用 Indy 或 Synapse 等第三方库来实现UDP通信。这里以Indy为例,首先你需要在你的项目中引入Indy的相关组件,例如 `TIdUDPServer` 和 `TIdUDPClient`。`TIdUDPServer` 用于设置服务器端,监听...

    Delphi7 Indy10.5.7 Openssl DLL

    我电脑是Delphi7,因为要试用百度云图文识别,所以要安装Indy10以上,我安装了Indy10.5.7,这个我找了好久了,基本上断断续续找了10几个小时了。实在是版本太多了,这个亲测可以用的,理论上说Indy10.5.X都可以用。

    delphi中Indy10的TCP连接教程

    Delphi中Indy10的TCP连接教程 在Delphi中使用Indy10实现TCP连接是一种常见的网络编程方式。Indy10是一个功能强大且灵活的网络开发库,提供了许多有用的组件和类来帮助开发者快速构建网络应用程序。 在本教程中,...

    delphi indy 10 官方demo

    **Delphi Indy 10 官方Demo详解** Delphi Indy 10 是一套强大的网络编程组件库,它为Delphi开发者提供了丰富的网络通信功能,包括TCP/IP、HTTP、FTP、SMTP、POP3等协议的支持。这个官方Demo是Delphi Indy 10的重要...

Global site tag (gtag.js) - Google Analytics