Indy TCP/IP 组件里的几个常用方法

其实Indy比较简单,但是可以提供的方法太多了。我找了很久,才搞明白。  
   
  比方说这个读取缓冲区的数据,就有很多种方法。相对于TTcpClient的几种方法来说,TIdTCPClient确实提供了多种选择,不仔细研究真的容易糊涂(其实我比较喜欢用CurrentReadBuffer):  
   
  1、ReadFromStack  
  原型:function   ReadFromStack(const   ARaiseExceptionIfDisconnected:   boolean;   const   ATimeout:   integer;   const   AUseBuffer:   boolean;   ADestStream:   TIdBuffer):   integer;   virtual;  
  用于判断缓冲区里是否还有数据可读,返回值:Integer   -   Number   of   bytes   read.  
   
  2、CurrentReadBuffer  
  原型:function   CurrentReadBuffer:   string;  
  用于读取Socket数据到缓冲区,注意返回为String类型,如果直接显示该String的数据,对于/0之后的数据可能看不到,因此要读取所有的数据,还必须利用CurrentReadBufferSize()判断该String的长度。  
  返回值:String   -   Contents   of   the   Indy   buffer.  
   
  3、GetResponse  
  原型:function   GetResponse(const   AAllowedResponses:   Array   of   SmallInt):   SmallInt;   virtual;  
  对于简单的命令应答可以使用这个方法获取应答消息,返回值:SmallInt   -   The   numeric   response   number.  
   
  4、ReadBuffer  
  原型:procedure   ReadBuffer(var   ABuffer;   const   AByteCount:   Longint);  
  读取指定数目的字节到缓冲区ABuffer,注意它会调用   ReadFromStack   以检查缓冲区里的数据是否少于AByteCount  
   
  5、ReadInteger  
  原型:function   ReadInteger(const   AConvert:   boolean):   Integer;  
  从缓冲区中读取整型数据,它会调用ReadBuffer  
   
  6、ReadLn  
  原型:function   ReadLn(const   ATerminator:   string;   const   ATimeout:   integer):   string;   virtual;  
  读取移行记录,带有一个TimeOut属性,以防止在读不到新行时死循环。返回值:String   -   Line   read   from   the   buffer.  
  注意行分隔符可能是以下几种:  
  #0   -   Default   Line   Feed   (#10)  
  LF   -   Line   Feed   (#10)  
  CR   -   Carriage   Return   (#13)  
  EOL   -   End-of-line   (Carriage   Return   +   Line   Feed)  
   
  7、ReadLnWait:  
  原型:function   ReadLnWait:   string;  
  很像ReadLn,但它会一直傻傻的等待  
   
  8、ReadSmallInt  
  原型:function   ReadSmallInt(const   AConvert:   boolean):   SmallInt;  
   
  9、ReadStream  
  原型:procedure   ReadStream(AStream:   TStream;   AByteCount:   LongInt;   const   AReadUntilDisconnect:   boolean);  
   
  10、ReadString  
  原型:function   ReadString(const   ABytes:   integer):   string;  
  与CurrentReadBuffer的不同在于它读取指定长度的字符串 
使用TIdAntiFreeze对抗“冻结”   Indy使用一个特殊的组件TIdAntiFreeze来透明地解决客户程序用户界面“冻结”的问题。TIdAntiFreeze在Indy内部定时中断对栈的调用,并在中断期间调用Application.ProcessMessages方法处理消息,而外部的Indy调用继续保存阻塞状态,就好像TIdAntiFreeze对象不存在一样。你只要在程序中的任意地方添加一个TIdAntiFreeze对象,就能在客户程序中利用到阻塞式Socket的所有优点而避开它的一些显著缺点。   Indy使用了线程技术   阻塞式Socekt通常都采用线程技术,Indy也是如此。从最底层开始,Indy的设计都是线程化的。因此用Indy创建服务器和客户程序跟在Unix下十分相似,并且Delphi的快速开发环境和Indy对WinSock的良好封装使得应用程序创建更加容易。   Indy服务器模型   一个典型的Unix服务器有一个或多个监听进程,它们不停地监听进入的客户连接请求。对于每一个需要服务的客户,都fork一个新进程来处理该客户的所有事务。这样一个进程只处理一个客户连接,编程就变得十分容易。   Indy服务器工作原理同Unix服务器十分类似,只是Windows不像Unix那样支持fork,而是支持线程,因此Indy服务器为每一个客户连接分配一个线程。   图1显示了Indy服务器的工作原理。Indy服务器组件创建一个同应用程序主线程分离的监听线程来监听客户连接请求,对于接受的每一个客户,都创建一个新的线程来为该客户提供服务,所有与这一客户相关的事务都由该线程来处理。   使用组件TIdThreadMgrPool,Indy还支持线程池。   线程与Indy客户程序   Indy客户端组件并未使用线程。但是在一些高级的客户程序中,程序员可以在自定义的线程中使用Indy客户端组件,以使用户界面更加友好。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值