《INDY控件操作指南》是一份详尽的手册,旨在帮助开发者掌握Delphi或C++ Builder中使用Indy组件进行网络编程的技术,涵盖TCP/IP、邮件服务等多方面内容。
使用TIdAntiFreeze对抗“冻结”
Indy采用一个特殊的组件TIdAntiFreeze来透明地解决客户程序用户界面“冻结”的问题。该组件在Indy内部定时中断对栈的调用,并且在此期间会调用Application.ProcessMessages方法处理消息,而外部的Indy调用则继续保持阻塞状态,仿佛TIdAntiFreeze对象不存在一样。只需在程序中的任意位置添加一个TIdAntiFreeze对象,便能在客户端应用程序中利用阻塞式Socket的所有优点,并避开它的显著缺点。
Indy采用了线程技术
通常情况下,阻塞式Socekt会使用线程技术来实现其功能,而Indy同样如此。从底层设计开始,Indy就是基于线程的架构。因此,在用Indy创建服务器和客户端程序时,过程与在Unix环境下非常相似,并且由于Delphi快速开发环境以及对WinSock的良好封装性,使得应用程序的构建变得更加容易。
Indy服务器模型
一个典型的Unix服务器拥有一个或多个监听进程来持续监控进入的客户连接请求。对于每一个需要服务的客户,都会fork一个新的子进程为其处理所有事务。这样的设计意味着每个进程只服务于一位客户,从而使编程工作变得相对简单。
在原理上,Indy服务器与Unix服务器非常相似:Windows操作系统虽然不支持像Unix那样的fork操作,但提供了线程机制来实现类似的功能。因此,在一个Indy服务器中,每当接受到一个新的客户端连接请求时,都会为该客户端分配一个新的线程来进行服务,并且所有与此客户相关的事务都将由这一特定的线程处理。
图1展示了这种工作原理:当创建一个Indy服务器组件时,它将生成与应用程序主线程分离的一个监听线程来等待客户的连接。对于每个被接受的请求,都会产生新的线程以提供相应的服务。
使用TIdThreadMgrPool组件,Indy还支持通过维护一组预定义数量的工作线程池来进行优化。
在处理客户端程序时
尽管Indy客户端组件本身不采用线程技术进行操作,在一些高级的应用场景中,开发者可以选择在一个自定义的线程内运作这些组件以改善用户体验。