Delphi Indy和socket的一些区别

关于INDY--DELPHI的Internet控件集

Delphi 2010 中包含了大量的Indy控件,网上找点资料转到博客下面给大家分享下。

你有没有用DELPHI开发Internet程序?是不是常常会烦恼FastNet组件为什么没有源代码?有很多问题,不看源代码,真不知道是什么问题。是不是也觉得FastNet组件支持的网络协议还不够多?现在不用烦恼了,有一套功能很丰富、使用很方便、开放源代码的免费INTERNET控件集可以解决你的烦恼。这套控件集就是INDY了。

  什么是INDY?它有什么功能?怎么用?就让我慢慢道来。

  INDY的全名是Internet Direct(也叫Winshoes),它是一套开放源代码的Internet控件集,它支持大部分流行的Internet协议,包括TCP、UDP、DNS、ICMP、FINGER、FTP、GOPHER、HTTP、POP3、SMTP、TELNET、WHOIS等,支持BASE64、MD2、MD4、MD5等编解码,提供INTERNET流行协议的客户端和服务器控件。INDY控件集的客户端和服务器控件都有完整、详细的源代码例程和帮助文件,用户可以根据这些例子,简单方便快速的建造各种服务器程序,例如WEB服务器、TELNET服务器、IRC服务器、TCP、UDP服务器等,而这些服务器都是支持多线程的。用户也可以很简单的编写出各种客户端程序,例如EMAIL、FINGER、FTP、PING、TELNET等。著名的OICQ使用的协议是UDP,有了INDY你可以使用UDP服务器和UDP客户端写出一个和OICQ较劲的东东来。

  INDY是完全基于SOCKET阻塞工作模式(后面讨论)的开发库,现在已经支持BORLAND DELPHI、C++ BUIDER和最新的Kylix(LINUX里的DELPHI)等开发平台。DELPHI 7.0将会把INDY作为它的INTERNET基本组件,由此可见INDY的强悍实力。

INDY提供的丰富例程就是绝好的教材。先编译几个例程,看看INDY的强大功能吧。要想熟练的使用好INDY,就得多多学习这些例程和参考帮助文件。

  熟悉WINSOCK编程的读者一定会觉得奇怪吧,为什么INDY是是完全基于SOCKET阻塞工作模式的呢?异步模式(非阻塞模式)是WINSOCK的一大特点,为什么不用呢?
  其实,之所以大多数WINDOWS下的INTERNET程序都使用异步模式,这和WINSOCK的历史有关。当WINSOCK被移植到WINDOWS的时候,当时的WINDOWS操作系统还是WINDOWS 3.1,而WINDOWS 3.1是不支持多线程的,不象UNIX下可以使用FORK来运行多进程。在WINDOWS 3.1下,如果使用阻塞模式,在通讯时会锁定用户界面使程序没有响应,为了避免这种情况,WINSOCK就引入异步模式这个新特性。而使用异步模式来编制INTERNET程序也就成了WINDOWS程序员的经典教条。但是,随着新的WINDOWS操作系统的出现,如WINDOWS 95、NT、98、ME、2000等,这些操作系统开始支持多线程。异步模式这个教条仍然深入人心,使很多程序员会下意识的拒绝使用阻塞模式。
  事实上,UNIX下的SOCKET只支持阻塞模式(现在UNXI的SOCKET有了一些新的非阻塞特性,不过绝大多数应用仍然使用阻塞模式)。阻塞模式具有以下几个比异步模式优越的特点:
  编程更简单,可以把所有处理SOCKET的代码放在一起,顺序执行,而不用分散在不同的事件处理代码段里。
  更容易移植到UNIX,使用INDY的DELPHI程序,可以不做太多(甚至不做)修改,就可以把WINDOWS的DELPHI源代码拿到LINUX下,用Kylix来编译成LINUX下的网络程序。 
更容易在多线程程序里使用,由于阻塞模式的代码可以放在一起,可以很方便的把这些代码包裹在线程里面来使用,而不象异步模式,需要针对不同的事件,设置不同的处理代码。

  为了兼顾简单可靠和高效,INDY是基于阻塞模式工作的。阻塞模式需要等待任务完成才返回,这样,当主线程里调用阻塞任务运行时,程序不能处理用户界面的消息。INDY提供了一个控件TidAntiFreeze来解决这个问题。只要在你的程序里,简单的填加一个TidAntiFreeze控件到任何地方(随便往FORM上放),不需要写任何代码(最多把超时时间改一下),就可以很好的解决用户界面不响应的问题。

  下面有两段示范代码,可以看出INDY控件的程序代码和其他使用异步模式的Internet控件的程序代码相比,是多么的简洁:

代码一:INDY控件的程序代码(IndyClient代表INDY控件的一般形式)

with IndyClient do begin

Connect;

Try

// 在这里写入你的处理代码

finally

Disconnect;

end;

end;

代码二:其他控件的程序代码(SocketComponent代表一般的Internet控件)

procedure TFormMain.TestOnClick(Sender: TComponent);

begin

with SocketComponent do begin

Connect; try

while not Connected do begin

if IsError then begin

Abort;

end;

Application.ProcessMessages;

OutData := ‘Data To send‘;

while length(OutData) > 0 do begin

Application.ProcessMessages;

end;

finally Disconnect; end;

end;

end;

procedure TFormMain.OnConnectError;

begin

IsError := True;

end;

procedure TFormMain.OnRead;

var

i: Integer;

begin

i := SocketComponent.Send(OutData);

OutData := Copy(OutData, i + 1, MaxInt);

end;

关于INDY的简单介绍就到这里了,感兴趣的朋友就去下载一个用吧,你一定会喜欢上它的。

Indy 与 Socket的异同

1.

下面比较一下serverSokcet与clientSocket和idTcpServer与idTcpClient两组通讯组件的异同:

socket即支持同部传送数据又支持异步传送数据。而idtcp则只支持同步传送数据。

serverSokcet与clientSocket是非阻塞式的,基于事件触发的。

idTcpServer与idTcpClient是阻塞式的,基于多线程的。

idTcpServer为每个连接的用户建立一个单独的线程,编程比较方便。

用indy作完成端口,经过压力测试,发现可以承受600个并发用户,当然这个与个人编程水平有关,做不好,100以上并发用户都难接受

2.

问:一个网络系统,在客户端相互信息发送时,同时要求记录保存到服务器的数据库里,请教服务器端/客户端分别用INDY的具体哪个控件比较合理?

答:IDTCPClient/IDTCPServer/IDUDPClient/IDUDPServer均可。 主要看具体应用要求

IDTCPClient/IDTCPServer会在运行时建立一个长时连接,直到退出;IDUDPClient/IDUDPServer则只管往指定的IP和端口发数据,能否收到由网络来决定。它们消耗的资源也是有所区别。

3.

tcpclient tcpserver和 idtcpclient idtcpserver不是同一个控件,再D7中,
他们分属在不同的模板(intenet,indy client,indy server),也有着不同的属性、方法和事件。
另外,intenet的tcpserver在接收数据是自动建立线程触发onAccept事件,因此必须要在此事件建立一个线程,可参考demo中的netchat例子。

1.阻塞模式编程建议用INDY的IDTCPCLIENT IDTCPSERVER
2.非阻塞模式建议用D7中可以通过 COMPONENT->INSTALL PACKAGES->add->DELPH7\BIN\DCLSOCKETS70.BPL来添加。
3。TCPCLIENT,TCPSERVER在D7中的DEMOS是用的阻塞模式,当客户端连接后建立了线程来处理和客户端的通讯问题。BLOCKMODE:=BMTHREADBLOCKING;
4。TCPCLIENT,TCPSERVER也可以工作在非阻塞模式,BLOCKMODE:=BMNOBLOCKING;这样就象CLIENTSOCKET SERVERSOCKET了,但是TCPCLIENT 可以象CLIENTSOCKET一样又ONREAD,ONWRITE,而TCPSERVER确没有看到象SERVERSOCKET那样的ONCLIENTREAD,ONCLIENTREAD.
5.查看TCPSERVER的源代码,发现他和TCPCLIENT一样最终是继承于TBaseSocket的,那么应该也可以有ONREAD,ONWRITE。
6。如果我们象TCPCLIENT那样作个procedure TcpServerReceive(Sender: TObject; Buf: PAnsiChar; var DataLen: Integer),你面写处理代码,然后TCPSERVER1.OnReceive:=TcpServerReceive; OnSend也如此类推,应该就可以了。
7。这个方法没有测试,但原理是这样的,只不过TCPSERVER的OnReceive,OnSend在设计时看不到而已,不等于他没有

时间: 2024-08-28 19:05:30

Delphi Indy和socket的一些区别的相关文章

UrlConnection连接和Socket连接的区别

关于UrlConnection连接和Socket连接的区别,只知道其中的原理如下:抽象一点的说,Socket只是一个供上层调用的抽象接口,隐躲了传输层协议的细节.urlconnection 基于Http协议,Http协议是应用层协议,对传输层Tcp协议进行了封装,是无状态协议,不需要你往考虑线程.同步.状态治理等,内部是通过socket进行连接和收发数据的,不过一般在数据传输完成之后需要封闭socket连接.直接使用Socket进行网络通讯得考虑线程治理.客户状态监控等,但是不用发送头信息等,更

[delphi]indy idhttp post方法

网易 博客 LOFTCam-用心创造滤镜 LOFTER-最美图片社交APP 送20张免费照片冲印 > 注册登录 加关注 techiepc的博客 万事如意 首页 日志 LOFTER 相册 音乐 收藏 博友 关于我 日志 关于我 techiepc 加博友   关注他 文章分类 ·默认分类(249) LOFTER精选 注册免费冲印20张照片 > 网易考拉推荐 网易新闻 湖南郴州现"多彩空调墙" ·男孩溺亡同伴藏其物品瞒23天 ·男子撞人逃逸后与伤者同病房 ·老汉谎称自焚:想要制造

DELPHI高性能大容量SOCKET并发(四):粘包、分包、解包

DELPHI高性能大容量SOCKET并发(四):粘包.分包.解包 粘包 使用TCP长连接就会引入粘包的问题,粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾.粘包可能由发送方造成,也可能由接收方造成.TCP为提高传输效率,发送方往往要收集到足够多的数据后才发送一包数据,造成多个数据包的粘连.如果接收进程不及时接收数据,已收到的数据就放在系统接收缓冲区,用户进程读取数据时就可能同时读到多个数据包. 粘包一般的解决办法是制定通讯协议,由协议来规

Delphi 类方法和普通方法的区别 .

//类声明  TMyClass = class  public    class procedure MyProc;  //类方式    constructor Create;      //Create 也是类方法  end; var  Form1: TForm1; implementation {$R *.dfm} { TMyClass } constructor TMyClass.Create;begin  inherited;  MyProc;  //内部调用类方法end; class

TCP/IP Http 和Https socket之间的区别

TCP/IP Http 和Https  socket之间的区别 TCP/IP是个协议组,它分为网络层,传输层和应用层, 在网络层有IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议. 在传输层中有TCP协议与UDP协议. 在应用层有FTP.HTTP.TELNET.SMTP.DNS等协议. TCP 是传输层协议,主要解决数据如何在网络中传输的,TCP连接是长连接第一次握手:客户端发送请求包到服务器,等待服务器确认第二次握手:服务器响应客户端请求,同时也发送一个回应包给客户端第三次握手

http、TCP/IP协议与socket之间的区别

网络由下往上分为:  www.2cto.com 物理层-- 数据链路层-- 网络层--                       IP协议 传输层--                       TCP协议 会话层-- 表示层和应用层--           HTTP协议 1.TCP/IP连接 手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接.TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在“无差别”的网络之上. 建立起一个TCP连

Windows Socket和Linux Socket编程的区别 ZZ

socket相关程序从Windows移植到Linux下需要注意的: 1)头文件 Windows下winsock.h/winsock2.h Linux下sys/socket.h 错误处理:errno.h 2)初始化 Windows下需要用WSAStartup Linux下不需要 3)关闭socket Windows下closesocket(...) Linux下close(...) 4)类型 Windows下SOCKET Linux下int 如我用到的一些宏: #ifdef WIN32 typed

Java之Socket与HTTP区别

我们都知道TCP/IP协议共分四层: ① 链路层,有时也称作数据链路层或网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡.它们一起处理与电缆(或其他任何传输媒介)的物理接口细节. ② 网络层,有时也称作互联网层,处理分组在网络中的活动,例如分组的选路.在TCP/IP协议族中,网络层协议包括IP协议(网际协议),ICMP协议(internet互联网控制报文协议),以及IGMP协议(internet组管理协议). ③ 传输层,主要为两台主机上的应用程序提供端到端的通信.在TCP

Http TCP/IP协议和socket之间的区别和联系

总结,TCP/IP是传输层协议,主要解决数据如何在网路中传输,socket是TCP/IP协议的具体实现,是对TCP/IP协议的封装和应用,属于程序员层面,HTTP是应用层协议,应用层协议很多,类似的像HTTP.FTP.Telnet. 传输层协议和应用层协议的区别和分工可以用下面的一段话做总结: "我们在传输数据时,可以只使用(传输层)TCP/IP协议,但是那样的话,如 果没有应用层,便无法识别数据内容,如果想要使传输的数据有意义,则必须使用到应用层协议,应用层协议有很多,比如HTTP.FTP.T