首先新建服务端。
如下图所示建立工程:
代码如下:
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,如果设置过小会因为线程大量占用而严重影响主程序正常工作,不知道有什么办法来解决这个问题。还有,当网络中没有服务器的任何响应时客户端也会出现假死现象,不知如何解决。
分享到:
相关推荐
Indy10 UDP收发结构体在Delphi 2010中的应用是一个关键的网络通信技术,主要用于构建基于UDP协议的高效、灵活的通信系统。本文将深入探讨 Indy10库如何在Delphi 2010环境中实现UDP通信,并讨论相关的核心结构体及其...
Delphi Indy UDP是用于在Delphi编程环境中实现UDP(用户数据报协议)网络通信的库。Indy(Internet Direct)是Delphi和C++Builder的一个组件集,它为开发人员提供了一套完整的网络协议栈,支持多种网络协议,包括TCP...
Indy(Internet Direct)是Delphi中的一个组件库,为开发者提供了丰富的网络编程接口,支持TCP(传输控制协议)和UDP(用户数据报协议)等网络通信协议。 TCP是一种面向连接的、可靠的传输协议,它确保了数据包在...
Delphi 2010 Indy 10.6.2 是一个针对 Delphi 开发者的网络组件库,它经过更新以支持最新的传输层安全(TLS)协议版本1.2。这个版本的Indy是为了帮助开发者在他们的应用程序中实现更安全的网络通信,特别是在面临旧的...
indy10 for delphi2010环境。不使用结构体,先构建多个tbytes类型的子buf,借用内存流,连接多个子buf合成一个buf,用udp发出去。接收端根据所建的子buf的数据长度,借助流将adata中各个子buf分离出来,最后合成文件...
在Delphi 2010中使用Indy 10进行SSL通信时,开发者需要依赖两个重要的动态链接库(DLLs):libeay32.dll和ssleay32.dll。这两个动态库是OpenSSL库的一部分,OpenSSL是一个开源项目,提供了用于加密通信和安全套接层...
根据delphi2010中的indy组件的TIdHTTP类制作封装了类:THttpModule/THttpsModule,实现了方法get和post。https访问需要的2个动态链接库文件(libeay32.dll、ssleay32.dll)也打在包中了。代码文件已经在delphi2010中...
在本文中,我们将深入探讨如何使用Delphi 2010和Indy 10.5.5库来实现一个简单的P2P(点对点)文件传输应用。Delphi是一款强大的面向对象的编程环境,而Indy则是一个功能丰富的网络组件套件,非常适合构建网络通信...
Indy(Internet Direct)是Delphi开发者常用的网络通信库,尤其在Delphi 7时代,它为开发跨平台的TCP/IP应用程序提供了强大的支持。这个压缩包包含的是已经编译好的Indy组件,可以直接添加到Delphi 7的库中使用,极...
为了使Delphi 2010的Indy 10支持TLS 1.2,通常需要更新或替换原有的OpenSSL库,这正是提供的"libeay32.dll"和"ssleay32.dll"文件的作用。它们可能包含了TLS 1.2所需的加密算法和函数实现,以确保Delphi 2010应用能够...
《Delphi7 Indy10.6.2:网络开发利器详解》 在IT行业中,网络开发是至关重要的一环,尤其对于软件开发者来说,拥有一款高效、稳定的网络库至关重要。Delphi7 Indy10.6.2正是这样一个针对Delphi开发者的强大网络开发...
delphi7 indy9 接口调用解决这2个问题(17个版本):“cound not load ssl library 、 error connecting with ssl”
indy10 ,使用DSPACK抓取摄像头图像,delphi2010环境。客户端发出视频请求,服务器端自动应答,开多线程,在线程中抓取图片后,采用JPEG压缩图片流,对图片流分包后,用Idudp发送出去。客户端组装流,合成jpg文件用...
安装步骤:1、在D7的目录下,双击Borland Delphi7.msi文件。 2、在弹出的对话框中选“Modify”。 3、然后点“Next”,在接下来的对话框中,找到Indy,点“Do Not Install”。之后一路“Next”,最后完成,就卸载成功...
在Delphi中使用Indy实现UDP打洞,主要涉及以下几个步骤: 1. **理解UDP**:UDP(User Datagram Protocol)是无连接的传输层协议,相比TCP,它不保证数据包的顺序、完整性和可靠性,但具有低延迟和简单协议的优点,...
Indy 10 是一个广泛使用的网络组件套件,尤其在Delphi开发环境中,它为开发者提供了构建网络应用的强大工具。对于Delphi 7这样的较旧版本,Indy 10 提供了更新的网络协议支持,如HTTP、FTP、SMTP、IMAP等,以及SSL/...
delphi 组件 indy10.5.7
Indy10.5.8 Delphi7 完美版 1.windows的path路径中增加D7的路径 在启用delphi7时,要能加载dclIndyCore70.bpl这个文件 如果是自动安装,这个文件会拷到C:\windows\system32\dclIndyCore70.bpl,所以不用改path 2....
Delphi中Indy10的TCP连接教程 在Delphi中使用Indy10实现TCP连接是一种常见的网络编程方式。Indy10是一个功能强大且灵活的网络开发库,提供了许多有用的组件和类来帮助开发者快速构建网络应用程序。 在本教程中,...
我电脑是Delphi7,因为要试用百度云图文识别,所以要安装Indy10以上,我安装了Indy10.5.7,这个我找了好久了,基本上断断续续找了10几个小时了。实在是版本太多了,这个亲测可以用的,理论上说Indy10.5.X都可以用。