`
cloud21
  • 浏览: 402426 次
  • 性别: 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通信,并讨论相关的核心结构体及其...

    基于主题词的文本案例检索算法研究.zip

    基于主题词的文本案例检索算法研究.zip

    TH6340B卧式加工中心鼠牙盘式分度工作台机械设计.rar

    TH6340B卧式加工中心鼠牙盘式分度工作台机械设计.rar

    青少年软件编程等级评价指南+第3部分 C++

    标准体系文件 T_CIE+104.3-2021 青少年软件编程 等级评价指南 第3部分 C_C++语言编程

    2025年机器身份安全现状报告.pdf

    内容概要:《2025年机器身份安全现状报告》揭示了机器身份安全在全球企业中的重要性和面临的挑战。随着云计算、AI和微服务的发展,机器身份数量已远超人类身份,成为现代网络安全的核心。然而,管理这些身份变得越来越复杂,许多组织缺乏统一的管理策略。77%的安全领导者认为每个未发现的机器身份都是潜在的风险点,50%的组织在过去一年中经历了与机器身份相关的安全事件,导致应用发布延迟、客户体验受损和数据泄露等问题。AI的兴起进一步加剧了这一问题,81%的安全领导者认为机器身份将是保护AI未来的关键。此外,证书相关故障频发,自动化管理仍不足,量子计算的威胁也逐渐显现。面对这些挑战,组织需要建立全面的机器身份安全计划,重点加强自动化、可见性和加密灵活性。 适合人群:从事信息安全、IT管理和技术架构规划的专业人士,尤其是关注机器身份管理和云原生环境安全的从业者。 使用场景及目标:①理解机器身份在现代企业安全架构中的关键作用;②识别当前机器身份管理中存在的主要风险和挑战;③探讨如何通过自动化、可见性和加密灵活性来提升机器身份安全管理的有效性;④为制定或优化企业机器身份安全策略提供参考。 其他说明:此报告基于对全球1,200名安全领导者的调查,强调了机器身份安全的重要性及其在未来几年内可能面临的复杂变化。报告呼吁各组织应重视并积极应对这些挑战,以确保业务连续性和数据安全。

    单级蜗轮蜗杆减速器(CAD)设计.rar

    单级蜗轮蜗杆减速器(CAD)设计.rar

    基于python+django校园智能点餐管理系统设计与实现(含程序源码和数据库)

    基于python+django校园智能点餐管理系统设计与实现(含程序源码和数据库),含有代码注释,新手也可看懂,个人手打98分项目,导师非常认可的高分项目,毕业设计、期末大作业和课程设计高分必看,下载下来,简单部署,就可以使用。该项目可以直接作为毕设、期末大作业使用,代码都在里面,系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值,项目都经过严格调试,确保可以运行! 基于python+django校园智能点餐管理系统设计与实现(含程序源码和数据库)基于python+django校园智能点餐管理系统设计与实现(含程序源码和数据库)基于python+django校园智能点餐管理系统设计与实现(含程序源码和数据库)基于python+django校园智能点餐管理系统设计与实现(含程序源码和数据库)基于python+django校园智能点餐管理系统设计与实现(含程序源码和数据库)基于python+django校园智能点餐管理系统设计与实现(含程序源码和数据库)基于python+django校园智能点餐管理系统设计与实现(含程序源码和数据库)基于python+django校园智能点餐管理系统设计与实现(含程序源码和数据库)基于python+django校园智能点餐管理系统设计与实现(含程序源码和数据库)基于python+django校园智能点餐管理系统设计与实现(含程序源码和数据库)基于python+django校园智能点餐管理系统设计与实现(含程序源码和数据库)基于python+django校园智能点餐管理系统设计与实现(含程序源码和数据库)基于python+django校园智能点餐管理系统设计与实现(含程序源码和数据库)基于python+django校园智能点餐管理系统设计与实现(含程序源码和数据库)基于python+django校园智能点餐管理系统设

    反光板定位算法源代码及建图软件分享:高精度AGV导航与定位

    内容概要:本文详细介绍了反光板(反光柱和反光贴)定位算法及其配套建图软件的技术细节。反光板定位算法通过激光SLAM技术,利用反射光线进行三角定位,从而精确计算机器人坐标。该算法兼容多种品牌雷达,适用于AGV导航,定位精度可达±7mm。文中不仅展示了关键代码片段,如激光信号处理和三角定位函数,还介绍了上位机建图软件的功能,包括地图创建、编辑、保存、导出等。此外,该软件可以在Windows或Ubuntu平台上运行,并可打包成exe文件进行便捷部署。实测表明,该系统在上万平方米的地图环境中表现出色,能够提供稳定可靠的定位服务。 适合人群:从事AGV导航、自动化物流、机器人开发等领域,需要高精度定位解决方案的研发人员和技术爱好者。 使用场景及目标:① 实现AGV在室内外环境中的高精度导航与定位;② 快速构建和编辑全局反光柱地图;③ 提供稳定的定位服务,确保机器人在复杂环境中的可靠运行。 其他说明:该技术已在多个工程项目中得到验证,具有高度的实用性和可靠性,能够显著提升项目的实施效率和成功率。

    基于VBA实现将邮件中的图片批量保存到PPT项目+源码+文档(毕业设计&课程设计&项目开发)

    基于VBA实现将邮件中的图片批量保存到PPT项目+源码+文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 支持配置参数 支持邮件扫描跨度 支持设置要扫描的游戏文件夹 支持配置多种规则 邮件主题通配符筛选 基于VBA实现将邮件中的图片批量保存到PPT项目+源码+文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用 支持配置参数 支持邮件扫描跨度 支持设置要扫描的游戏文件夹 支持配置多种规则 邮件主题通配符筛选

    材料科学中蒙特卡洛法模拟晶粒生长:结合AbaqusAnsys与MATLAB的应用及教程 材料科学

    内容概要:本文详细介绍了蒙特卡洛法在材料科学研究中模拟晶粒生长的具体应用。首先阐述了蒙特卡洛法作为一种基于随机抽样的数值模拟方法,在模拟熔池宏观温度场及其对晶粒生长影响方面的优势。接着,文章讲解了如何利用专业仿真软件Abaqus和Ansys建立宏观温度场模型,并结合MATLAB编写程序实现微观晶粒生长的模拟。文中还提供了详细的程序步骤,从选择仿真软件到最终输出晶粒生长结果,涵盖了参数设置、随机数生成等多个关键环节。此外,为便于读者理解,附有参数设置及操作流程的视频教程。 适合人群:从事材料科学研究的专业人士、高校相关专业的师生、对材料微观结构模拟感兴趣的科研工作者。 使用场景及目标:适用于希望深入了解晶粒生长机制的研究人员,旨在通过实际案例和具体工具掌握蒙特卡洛法在材料科学中的应用技巧,提高对微观物理现象的理解能力。 其他说明:文章不仅提供了理论指导,还有实用的操作指南和示例代码,有助于读者快速上手并应用于实际项目中。

    多功能自动跑步机的设计.rar

    多功能自动跑步机的设计.rar

    ZY1362玉米剥皮机设计(全套8张CAD图+说明书+外文翻译).rar

    ZY1362玉米剥皮机设计(全套8张CAD图+说明书+外文翻译).rar

    QT使用QXlsx读取excel表格中的图片

    QT使用QXlsx读取excel表格中的图片

    光储并网直流微电网Simulink仿真:MPPT与混合储能系统的电能质量优化 Simulink

    内容概要:本文详细介绍了基于Simulink仿真的光储并网直流微电网模型,旨在优化电能质量和提升系统效率。主要内容涵盖三个关键部分:一是通过MPPT(最大功率点跟踪)算法使光伏板达到最大功率输出,具体采用了扰动观察法,并实现了动态调整扰动步长的方法来快速逼近最大功率点;二是构建由超级电容和蓄电池组成的混合储能系统,利用二阶低通滤波法对不同频率范围内的功率波动进行分配,从而提高储能系统的响应速度和平滑度;三是设计基于电网电压的双闭环控制系统,用于稳定并网电流,特别是通过PR控制器将总谐波失真(THD)降低至2%以下。此外,文中还提供了具体的MATLAB代码片段以及仿真过程中需要注意的关键细节。 适用人群:从事电力电子、新能源系统设计与仿真的工程师和技术研究人员。 使用场景及目标:适用于需要深入了解光储并网直流微电网建模方法及其优化策略的研究人员,帮助他们掌握如何通过Simulink平台实现高效稳定的微电网仿真,特别是在电能质量优化方面。 其他说明:文中提到的技术手段不仅限于理论探讨,还包括大量实践经验分享,如仿真步长的选择、各组件参数配置等,有助于读者更好地理解和应用相关技术。

    毕业设计-云支付-整站商业源码.zip

    毕业设计-云支付-整站商业源码.zip

    基于ADM自适应增量调制算法的Matlab性能仿真及对比分析 Matlab

    内容概要:本文详细介绍了基于ADM(自适应增量调制)算法的Matlab性能仿真及其与DM(增量调制)算法的对比。主要内容包括:生成随机信号,应用ADM和DM算法进行处理,解调信号并计算解调后输出与参考输入间的信噪比,最终展示和分析两种算法的性能差异。文中提供了详细的项目工程源文件、完整中文注释及操作视频,确保用户能够顺利运行和理解整个仿真过程。 适合人群:具有一定Matlab基础的研究人员和技术爱好者,尤其是对数字通信和信号处理感兴趣的读者。 使用场景及目标:适用于希望深入了解ADM和DM算法性能差异的科研工作者和工程师,旨在为实际应用场景选择最优算法提供理论依据和技术支持。 其他说明:本文使用的Matlab版本为2022a及以上,附带的源文件和视频教程便于用户快速上手和深入研究。

    PSCAD与Simulink在高压直流输电及新能源并网中的仿真应用 HVDC

    内容概要:本文详细介绍了PSCAD与Simulink这两种仿真工具在电力系统中的应用,特别是针对高压直流输电(HVDC)、光伏并网、MMC并网模型以及微网的相关模型构建和仿真分析。文章首先简述了PSCAD和Simulink的基本特点和优势,随后分别探讨了它们在各个领域的具体应用,如HVDC系统的运行特性分析、光伏并网系统的优化策略、MMC并网模型的控制策略改进以及微网能量管理和资源配置优化。最后,强调了这些仿真工具对于提升电力系统稳定性、可靠性和效率的重要意义。 适合人群:从事电力系统设计、仿真和研究的专业人士,尤其是关注高压直流输电、新能源并网技术和微网发展的工程师和技术研究人员。 使用场景及目标:适用于需要进行复杂电力系统建模和仿真的场合,旨在帮助用户更好地理解和优化电力系统的运行特性,提高系统的稳定性和可靠性。 其他说明:文中提供了丰富的实例和详细的步骤指导,有助于读者快速掌握PSCAD和Simulink的具体操作方法,并将其应用于实际项目中。

    SOEM库源码(EtherCAT 主站协议库)

    SOEM库源码(EtherCAT 主站协议库)

    半封闭螺杆压缩机的CAD图纸.rar

    半封闭螺杆压缩机的CAD图纸.rar

    COMSOL流热拓扑优化:无量纲化处理实现高效换热与低能耗多目标优化 拓扑优化 Comsol流热拓扑优化:无量纲化处理多目标优化,追求最大换热与最小耗散

    内容概要:本文详细介绍了利用COMSOL进行流热拓扑优化的方法,重点探讨了如何通过无量纲化处理和多目标优化策略,在散热设计中同时实现高效的热交换和最小的能量耗散。文中展示了关键的MATLAB代码片段,解释了SIMP材料插值和Heaviside投影的作用,并讨论了无量纲化处理的具体步骤及其优势。此外,还提到了将多个目标整合为单一指标的技术以及如何通过帕累托前沿解决多目标优化问题。最后给出了实际应用中的建议,如先进行单目标优化,再构建代理模型,并监控拓扑演变。 适合人群:从事热管理、流体力学仿真、优化设计的研究人员和技术人员。 使用场景及目标:适用于需要提高热交换效率并降低能耗的设计项目,特别是在电子设备冷却、能源系统等领域。目标是掌握COMSOL软件中流热拓扑优化的具体实施方法,理解无量纲化处理的意义,学会构建有效的多目标优化模型。 阅读建议:读者应在熟悉基本的热力学和流体力学概念的基础上,逐步深入理解文中提到的各种技术和方法,并尝试将其应用于实际工程问题中。

Global site tag (gtag.js) - Google Analytics