




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Delphi2009的Indy全接触之UDP篇首先新建服务端。如下图所示建立工程:代码如下:unitServerUnit;interfaceusesWindows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,Dialogs,IdBaseComponent,IdComponent,IdUDPBase,IdUDPServer,StdCtrls,IdSocketHandle,IdGlobal;typeTServerForm=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);privatePrivatedeclarationspublicPublicdeclarationsend;varServerForm:TServerForm;implementation$R*.dfm/窗体创建部分procedureTServerForm.FormCreate(Sender:TObject);beginIdUDPServer1.DefaultPort:=3030;IdUDPServer1.Active:=True;Edit1.ReadOnly:=True;Edit2.ReadOnly:=True;Edit3.ReadOnly:=True;end;/数据接收部分procedureTServerForm.IdUDPServer1UDPRead(AThread:TIdUDPListenerThread;AData:TBytes;ABinding:TIdSocketHandle);beginEdit1.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;interfaceusesWindows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,Dialogs,StdCtrls,ExtCtrls,IdBaseComponent,IdComponent,IdUDPBase,IdUDPClient;typeTClientForm=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);privatePrivatedeclarationspublicPublicdeclarationsend;varClientForm:TClientForm;implementation$R*.dfm/数据发送procedureTClientForm.Button1Click(Sender:TObject);beginIdUDPClient1.Broadcast(Edit1.Text,3030);Timer1.Enabled:=True;end;/窗体创建procedureTClientForm.FormCreate(Sender:TObject);beginTimer1.Enabled:=False;Edit2.ReadOnly:=True;end;/数据接收procedureTClientForm.Timer1Timer(Sender:TObject);beginEdit2.Text:=IdUDPClient1.ReceiveString(-1);Timer1.Enabled:=False;end;end.如此实现简单的UDP协议下局域网通讯。但是很快我又发现,上面的代码在本机虽然能够正常执行,分别位于2台电脑时会发生无法接收服务器响应的现象。究其原因可能是客户程序用户界面“冻结”的缘故。于是在服务端和客户端都加上TIdAntiFreeze以解决上面发生的现象(尤其是客户端)。服务端:客户端:事实上,上述客户端的TTimer控件是完全没有必要使用的。当我们对IdUDPClient使用Broadcast方法后,一旦与服务端通讯成功,IdUDPClient自动会得到来自服务端的返回值。如果通讯失败,在IdUDPClient.ReceiveTimeout所设定的事件后终止响应,所以我们可以吧延迟事件稍微设长一点。于是客户端代码可以简单的写成unitClientUnit;interfaceusesWindows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,Dialogs,StdCtrls,ExtCtrls,IdBaseComponent,IdComponent,IdUDPBase,IdUDPClient,IdAntiFreezeBase,IdAntiFreeze;typeTClientForm=class(TForm)Label1:TLabel;Edit1:TEdit;Button1:TButton;Label2:TLabel;Edit2:TEdit;IdUDPClient1:TIdUDPClient;IdAntiFreeze1:TIdAntiFreeze;procedureButton1Click(Sender:TObject);procedureFormCreate(Sender:TObject);privatePrivatedeclarationspublicPublicdeclarationsend;varClientForm:TClientForm;implementation$R*.dfm/数据发送procedureTClientForm.Button1Click(Sender:TObject);beginIdUDPClient1.Broadcast(Edit1.Text,3030);Edit2.Text:=IdUDPClient1.ReceiveString(-1);end;/窗体接收procedureTClientForm.FormCreate(Sender:TObject);beginIdUDPClient1.ReceiveTimeout:=5000;Edit2.ReadOnly:=True;end;end.如此即可完成与服务端的通讯。关于网络中查找服务器主机的问题,似乎可以使用UDP广播的方式查找。先看代码:unitClientUnit;interfaceusesWindows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,Dialogs,StdCtrls,ExtCtrls,IdBaseComponent,IdComponent,IdUDPBase,IdUDPClient,IdAntiFreezeBase,IdAntiFreeze;typeTClientForm=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);privatePrivatedeclarationsvarIpList:TStringList;publicPublicdeclarationsend;varClientForm:TClientForm;implementation$R*.dfmprocedureTClientForm.Button1Click(Sender:TObject);beginIdUDPClient1.Broadcast(Edit1.Text,3030);ListBox1.Items.Add(IdUDPClient1.ReceiveString();end;procedureTClientForm.FormCreate(Sender:TObject);beginIdUDPClient1.ReceiveTimeout:=10000;IpList:=TStringList.Create;end;procedureTClientForm.Timer1Timer(Sender:TObject);varipaddr:string;varI:Integer;beginIdUDPClient1.BroadcastEnabled:=True;IdUDPClient1.Broadcast(SearchHost,3030);ipaddr:=IdUDPClient1.ReceiveString();ifIpList.IndexOf(ipaddr)=-1thenIpList.Add(ipaddr);ListBox1.Cl
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- Ethane-1-2-diamine-d4-dihydrochloride-Ethylenediamine-d-sub-4-sub-dihydrochloride-生命科学试剂-MCE
- 分期还款合同
- 2025年湛江市事业单位考试真题
- 农发行潍坊市昌乐县2025秋招群面模拟题及高分话术
- 央行法律知识培训课件
- 农发行石家庄市晋州市2025秋招笔试行测高频题及答案
- 新能源产业2025年并购重组知识产权价值评估案例解析
- 农发行邢台市南宫市2025秋招笔试创新题型专练及答案
- 2025年新能源汽车充电行业产业链上下游协同发展分析报告
- 工业园安全员培训课件
- 弘扬志愿服务精神主题班会
- 血透病人高血压护理查房
- 电瓶车撞车调解协议书(2篇)
- 《企业能效对标管理》课件
- 2024版非ST段抬高型急性冠脉综合征诊断和治疗指南解读
- EPC工程总承包项目部人员岗位职责
- 《中国马克思主义与当代》课后题答案
- 爆炸物品生产安全操作规程
- 中华人民共和国统计法
- 热电厂输煤作业安全培训
- 形成性评价指导性规范:SOAP病例汇报评价
评论
0/150
提交评论