socket编程 - Asyncsocket(详解版)

  1. iPhone的标准推荐是CFNetwork 库编程,其封装好的开源库是 cocoa AsyncSocket库,用它来简化CFNetwork的调用,它提供了异步操作
  2.        主要特性有:       
    1. 队列的非阻塞的读和写,而且可选超时。你可以调用它读取和写入,它会当完成后告知你
    2. 自动的socket接收。如果你调用它接收连接,它将为每个连接启动新的实例,当然,也可以立即关闭这些连接
    3. 委托(delegate)支持。错误、连接、接收、完整的读取、完整的写入、进度以及断开连接,都可以通过委托模式调用
    4. 基于run loop的,而不是线程的。虽然可以在主线程或者工作线程中使用它,但你不需要这样做。它异步的调用委托方法,使用NSRunLoop。委托方法包括socket的参数,可让你在多个实例中区分
    5. 自包含在一个类中。你无需操作流或者socket,这个类帮你做了全部
    6. 支持基于IPV4和IPV6的TCP流

  1.  

  2.  
  3.       加入:AsynSocket.h .m与AsynUdpSocket.h .m四个文件 及CFNetwork.framework
  4.      TCP客户端 
  5.            #import "AsyncSocket.h"

  6.  
  7.            @interface HelloiPhoneViewController : UIViewController {
  8.                 UITextField    * textField;
  9.                 AsyncSocket * asyncSocket;
  10.              }
  11.             @property (retain, nonatomic) IBOutlet UITextField *textField;
  12.              - (IBAction) buttonPressed: (id)sender;
  13.              - (IBAction) textFieldDoneEditing: (id)sender;    
  14.              @end
  15.  
  16.              在需要联接地方使用connectToHost联接服务器
  17.               其中initWithDelegate的参数中self是必须。这个对象指针中的各个Socket响应的函数将被ASyncSocket所调用.initWithDelegate把将当前对象传递进去,这样只要在当前对象方法实现相应方法
  18.  
  19.                asyncSocket = [[AsyncSocket alloc] initWithDelegate:self]; 
  20.                NSError *err = nil; 
  21.                if(![asyncSocket connectToHost:host on:port error:&err]) 
  22.                 { 
  23.                    NSLog(@"Error: %@", err); 
  24.                  } 
  25.  
  26.              关于NSData对象
  27.               无论SOCKET收发都采用NSData对象.它的定义是 http://developer.apple.com/library/mac /#documentation/Cocoa/Reference/Foundation/Classes/NSData_Class/Reference/Reference.html
  28.               NSData主要是带一个(id)data指向的数据空间和长度 length.
  29.               NSString 转换成NSData 对象
  30.  
  31.                NSData* xmlData = [@"testdata" dataUsingEncoding:NSUTF8StringEncoding];
  32.               NSData 转换成NSString对象
  33.  
  34.              NSData * data;
  35.                NSString *result = [[NSString alloc] initWithData:data         encoding:NSUTF8StringEncoding];
  36.  
  37.                发送数据
  38.                 AsyncSocket  writeData    方法来发送数据,它有如下定义
  39.     - (void)writeData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag;
  40.  
  41.                以下是一个实例语句.
  42.                NSData* aData= [@"test data" dataUsingEncoding: NSUTF8StringEncoding];
  43.               [sock writeData:aData withTimeout:-1 tag:1];

  44.  
  45.               在onSocket重载函数,有如定义采用是专门用来处理SOCKET的发送数据的:
  46.                -(void)onSocket(AsyncSocket *)sock didWriteDataWithTag:(long)tag
  47.               {
  48.                     NSLog(@"thread(%),onSocket:%p didWriteDataWithTag:%d",[[NSThread currentThread] name],
  49.      sock,tag);
  50.                } 
  51.  
  52.                接收Socket数据.
  53.                在onSocket重载函数,有如定义采用是专门用来处理SOCKET的接收数据的.
  54.                -(void) onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
  55.                在中间将其转换成NSString进行显示.
  56.     NSString* aStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
  57.     NSLog(@"===%@",aStr); 
  58.     [aStr release];

  59.  
  60.       6、TCP连接读取制定长度的数据
  61.            socket连接,可能会读取固定长度的字节
  62.            [socket readDataToLength: withTimeout :tag]

  63.  
  64. 各方法的解析
  65.        -(void)onSocket:(AsyncSocket *)sock willDisconnectWithError:(NSError *)err;   
  66.        发生错误,socket关闭,可以在call-back过程调用"unreadData"去取得socket的最后的数据字节,当连接的时候,该委托方法在    onSocket:didAcceptNewSocket: 或者 onSocket:didConnectToHost: 之前调用

  67.  
  68.       -(void)onSocketDidDisconnect:(ASyncSocket *)sock;
  69.       当socket由于或没有错误而断开连接,如果你想要在断开连接后release socket,在此方法工作,而在onSocket:willDisconnectWithError 释放则不安全

  70.  
  71.        -(void)onSocket:(AsyncSocket *)sock didAcceptNewSocket:(AsyncSocket *)newSocket;
  72.         当产生一个socket去处理连接时调用,此方法会返回 线程上的run-loop 的新的socket和其应处理的委托,如果省略,则使用[NSRunLoop cunrrentRunLoop]

  73.  
  74.           -(BOOL)onSocketWillConnect:(AsyncSocket *)sock;

  75.  
  76.        -(void)onSocket:(AsyncSocket *)sock didConnectToHost :(NSString *)host port:(UINt16)port;
  77.           当socket连接正准备读和写的时候调用,host属性是一个IP地址,而不是一个DNS 名称

  78.  
  79.          -(void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long) tag;
  80.          当socket已完成所要求的数据读入内存时调用,如果有错误则不调用

  81.  
  82.          -(void)onSocket:(Asyncsocket *)sock didReadPartialDataOfLength:(NSUInteger)partiaLength tag:(long)tag;
  83.            当一个socket读取数据,但尚未完成读操作的时候调用,如果使用 readToData: or readToLength: 方法 会发生,可以被用来更新进度条等东西

  84.  
  85.             -(void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag;
  86.              当一个socket已完成请求数据的写入时候调用

  87.  
  88.             -(void)onSocket:(AsyncSocket *)sock didWritePartialDataOfLength:(NSUInteger)partialLength tag:(long)tag;
  89.              当一个socket写入一些数据,但还没有完成整个写入时调用,它可以用来更新进度条等东西

  90.  
  91.                -(NSTimeInterval)onSocket:(AsyncSocket *)sock shouldTimeoutReadWithTag:(long)tag elapsed:(NSTimeInterval)exapsed bytesDone:(NSUInteger)length
  92.               使用读操作已超时但还没完成时调用,此方法允许随意延迟超时,如果返回一个正的时间间隔,读取的超时将有一定量的扩展,如果不实现这个方法,或会像往常一样返回一个负的时间间隔,elapsed参数是  原超时的总和,加上先前通过这种方法添加的任何补充, length参数是 读操作到目前为止已读取的字节数, 注意,如果返回正数的话,这个方法可能被一个单独的读取多次调用

  93.  
  94.                -(NSTimeInterval)onSocket:(AsyncSocket *)sock shouldTimeoutWriteWithTag:(long)tag elapsed:(NSTimeInterval)elapsed bytesDone:(NSUInteger)length;
  95.                 如果一个写操作已达到其超时但还没完成时调用,同上

  96.  
  97.                -(void)onSocketDidSecure:(AsyncSocket *)sock;
  98.                在socket成功完成ssl/tls协商时调用,此方法除非你使用提供startTLS方法时候才调用,
  99.     如果ssl/tls是无效的证书,socket将会立即关闭,onSocket:willDisconnectWithError:代理方法竟会与特定的ssl错误代码一起调用

  100.  
  101.                -(BOOL)canSafelySetDelegate
  102.                用来查看在改变它之前,是否带有与当前的委托有悬而未决的业务(读/写)。当然,应在安全连接或接受委托之前改变委托

  103.  
  104.               一旦接收或连接方法之一被调用,AsyncSocket实例会被锁定,其他接收/连接方法在没有先断开socket不会被调用
  105.               如果尝试失败或超时,这些方法要么返回NO 要么调用 onSocket:willDisconnectWithError: 或 onSockedDidDisconnect
  106.               当传入的连接被接受,AsyncSocket调用多个委托方法。这些方法按照时间顺序排列:
  107.                  1.onSocket:didAcceptNewSocket:
  108.                  2.onSocket:wantsRunLoopForNewSocket:
  109.                  3. onSocketWillConnect:
  110.                
  111.               你的服务器的代码将需要保留公认的socket(如果要接受它),最好的地方是要做到这一点可能在onSocket:didAcceptNewSocket:方法    
  112.              在读和写流已经为新接受的socket设置,onSocket:didConnectToHost:port 方法将在适当的运行循环调用
  113.              多线程注意,如果要想通过实施onSocket:wantsRunLoopForNewSocket:,移动另一个新接受的socket去到另一个循环的socket。然后,应该在调用读和写或者startTLS方法前,等待直到onSocket:didConnectToHost:port:方法。否则读和写时间原定于不正确的runloop,混乱可能会随之而来

  114.  

  115.  
  116.              -(BOOL)acceptOnPort:(UInit16)port error:(NSError **)errPtr;
  117.              告诉socket开始听取和接受制定端口上的连接,当一个连接到来的时候,AsyncSocket实例将调用各种委托方法,socket将听取所有可用的接口(wifi,以太网等)

  118.  
  119.              -(BOOL)connectToHost:(NSString *)hostname onPort:(UInt16)port error :(NSError **)errPtr;
  120.              连接给定的主机和端口,主机hostname可以是域名或者是Ip地址

  121.  
  122.              -(BOOL)connectToAddress:(NSData *)remoteAddr error:(NSError *)errPtr;
  123.              连接到一个给定的地址,制定一个sockaddr结构包裹住一个NSData对象,例如,NSData对象从NSNetService的地址方法返回,如果有一个现有的sockaddr结构,可以将它转换到一个NSData对象,像这样:
  124.  struct sockaddr sa  -> NSData *dsa = [NSData dataWithBytes:&remoteAddr length:remoteAddr.sa_len];
  125.  struct sockaddr *sa -> NSData *dsa = [NSData dataWithBytes:remoteAddr length:remoteAddr->sa_len];

  126.  
  127.              -(void)disconnect;
  128.                 立即断开,任何未处理的读或写都将被丢弃
  129.                 如果socket还没有断开,在这个方法返回之前,onSocketDidDisconnect 委托方法将会被立即调用
  130.                  注意推荐释放AsyncSocket实例的方式:
  131.                    [asyncSocket setDelegate:nil];
  132.                    [asyncSocket disconnect];
  133.                    [asyncSocket release];

  134.  
  135.               -(void)disconnectAfterReading;
  136.                  在已经完成了所有悬而未决的读取时 断开,在调用之后,读取和写入方法将无用,socket将断开 即使仍有待写入

  137.  
  138.               - (NSString *)connectedHost;
  139.               - (UInt16)connectedPort;
  140.               - (NSString *)localHost;
  141.               - (UInt16)localPort;
  142.                 返回本地和远程主机和端口给连接的socket,如果没有连接会返回nil或0,主机将会是一个IP地址

  143.  
  144.              -(NSData *)connectedAddress
  145.              -(NSData *)localAddresss
  146.                 返回本地和远程的地址给连接的socket,指定一个socketaddr结构包裹在一个NSData对象

  147.  

  148.  
  149.                 readData和writeData方法不会是block(它们是异步的)
  150.                当读完成 onSocket:didReadData:withTag: 委托方法时调用
  151.                当写完成 onSocket:didWriteDataWithTag: 委托方法时调用
  152.                可以选择任何读/写操作的超时设置(为了不超时,使用负时间间隔。)
  153.                如果读/写操作超时,相应的 onSocket:shouldTimeout...委托方法被调用去选择性地允许我们去延长超时
  154.                超时后,onSocket:willDisconnectWithError: 方法被调用,紧接着是 onSocketDidDisconnect
  155.                tag是为了方便,可以使用它作为数组的索引、步数、state id 、指针等 

  156.  

  157.  

  158.  
  159.             -(void)readDataWithTimeout:(NSTimeInterval)tiemout tag:(long)tag;
  160.               读取socket上第一次成为可用的字节,如果timeout值是负数的,读操作将不使用timeout

  161.  
  162.             - (void)readDataWithTimeout:(NSTimeInterval)timeout buffer:(NSMutableData *)buffer bufferOffset:(NSUInterger)offset tag:(long)tag;
  163.               读取socket上第一次成为可用的字节
  164.               字节将被追加到给定的字节缓冲区,从给定的偏移量开始
  165.               如果需要,给定的缓冲区大小将会自动增加
  166.               如果timeout值是负数的,读操作将不使用timeout
  167.               如果缓冲区为空,socket会为我们创建一个缓冲区
  168.               如果bufferOffset是大于给定的缓冲区的长度,该方法将无用,委托将不会被调用
  169.               如果你传递一个缓冲区,当AsyncSocket在使用它的时候你不能以任何方式改变它
  170.               完成之后,onSocket:didReadData:withTag 返回的数据将是一个给定的缓冲区的子集
  171.               也就是说,它将会被引用到被追加的给定的缓冲区的字节

  172.  
  173.             -(void)readDataToLength:(NSUInterger)length withTimeout:(NSTimeInterval)timeout tag:(long)tag;
  174.             读取给定的字节数,如果length为0,方法将无用,委托将不会被调用

  175.  
  176.             -(void)readDataToLength:(NSUInteger)length withTimeout:(NSTimeInterval)tiemout buffer:(NSMutableData *)buffer bufferOffset:(NSUInteger) offset tag:(long)tag;
  177.             读取给定的字节数,在给定的偏移开始,字节将被追加到给定的字节缓冲区

  178.  
  179.             -(void)readDataToData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag;
  180.             读取字节直到(包括)传入的作为分隔的"data"参数
  181.             如果传递0或者0长度的数据,"data"参数,该方法将无用,委托将不会被调用
  182.             从socket读取一行,使用"data"参数作为行的分隔符 (如HTTP的CRLF)
  183.             注意,此方法不是字符集,因此,如果一个分隔符出现,它自然可以作为进行编码的一部分,读取将提前结束

  184.  
  185.             -(void)readDataToData:(NSData *)data withTimeout:(NSTimeInterval)timeout buffer:(NSMutableData *)buffer bufferOffset:(NSUInteger) offset tag:(long)tag;
  186.            读取字节直到(包括)传入的作为分隔的“data”参数,在给定的偏移量开始,字节将被追加到给定的字节缓冲区。
  187.            从socket读取一行,使用"data"参数作为行的分隔符(如HTTP的CRLF)

  188.  
  189.            -(void)writeData:(NSData *)data withTimeout:(NSTimeInterval) timeout tag:(long)tag;
  190.           将data写入socket,当完成的时候委托被调用 

  191.  
  192.            - (float)progressOfReadReturningTag:(long *)tag bytesDone:(NSUInteger *)done total:(NSUInteger *)total;
  193.            - (float)progressOfWriteReturningTag:(long *)tag bytesDone:(NSUInteger *)done total:(NSUInteger *)total;
  194.            返回当前读或写的进度,从0.0 到 1.0 或者 如果没有读/写的时候返回Nan(使用isNan来检查)
  195.    tag、done、total如果不为空的话,它们将会被填补

  196.  
  197.            

  198.  
  199.            - (void)startTLS:(NSDictionary *)tlsSettings;
  200.            确保使用ssl/tls连接
  201.            这方法可被随时调用,tls握手将会发生在所有悬而未决的读/写完成之后。这紧跟着一个发送依赖 StartTLS消息的协议选项,在排队升级到TLS的同一时间,而不必等待写入完成。在这个方法被调用后,任何读写计划 将会发生在安全链接
  202.            对于可能的keys和TLS设置的值是有据可查的
  203.            一些可能的keys是:
  204.               * - kCFStreamSSLLevel
  205.               * - kCFStreamSSLAllowsExpiredCertificates
  206.               * - kCFStreamSSLAllowsExpiredRoots
  207.               * - kCFStreamSSLAllowsAnyRoot
  208.               * - kCFStreamSSLValidatesCertificateChain
  209.               * - kCFStreamSSLPeerName
  210.               * - kCFStreamSSLCertificates
  211.               * - kCFStreamSSLIsServer

  212.  
  213.            如果你传递空或者空字典,将使用默认的字典
  214.            默认设置将检查以确保由签署可信的第三方证书机构和没有过期的远程连接的证书
  215.            然而,它不会验证证书上的名字,除非你给它一个名字,通过kCFStreamSSLPeerName键去验证
  216.            这对安全的影响是重要的理解
  217.            想象一下你正试图创建一个到MySecureServer.com的安全连接,但因为一个被攻击的DNS服务器,所以你的socket被定向到MaliciousServer.com
  218.            如果你只是使用默认设置,MaliciousServer.com 有一个有效的证书
  219.            默认设置将无法监测到任何问题,因为证书是有效的
  220.           在这个特殊的情况下,要妥善保护你的连接,应设置kCFStreamSSLPeerName性质为MySecureServer.com.
  221.          如果事前你不知道对等的名字的远程主机(例如,你不确认它是domain.com" or "www.domain.com"),那么你可以使用默认设置来验证证书,然后在获得验证的发行后使用X509Certificate类来验证,X509Certificate类的CocoaAsyncSocket开源项目的一部分

  222.  
  223.          -(void)enablePrebuffering
  224.          对于处理readDataToData请求,数据是必须从socket以小增量的方式读取出来的
  225.          性能通过允许AsyncSocket去一次性读大块的数据和存储任何一个小的内部缓冲区溢出的东西来大大提高
  226.          这被称为预缓冲,就好像一些数据在你要求它之前就可能被读取出来
  227.          如果你经常使用readDataToData,使用预缓冲会有更好的性能,尤其是在iphone上
  228.          默认的预缓冲状态是由DEFAULT_PREBUFFERING 定义控制的,强烈建议设置其为yes
  229.          这方法存在一些预缓冲需要一些不可预见的原因被默认禁用的情况,这时,这种方法存在允许当就绪时,可轻松启用预缓冲

  230.  
  231.           -(BOOL)moveToRunLoop:(NSRunLoop *)runLoop;
  232.           当你创建一个AsyncSocket,它被添加到当前线程runloop
  233.           对于手动创建的socket,在线程上你打算使用它,它是最容易简单的创建的线程上的socket
  234.           当一个新的socket被接受,委托方法 onSocket:wantsRunLoopForNewSocket 会被调用 允许你在一个单独的线程上放置socket,这个工作最好结合在同一个线程池设计
  235.           如果,但是,在一个单独的线程上,在之后的时间,你需要移动一个socket,这个方法可以用来完成任务
  236.           此方法必须从 当前运行的 线程/runloop 的socket 调用
  237.           注意:此方法调用后,所有进一步的方法应该从给定的runloop上调用这个对象
  238.           此外,所有委托调用将会发送到给定的runloop

  239.  

  240.  
  241.           - (BOOL)setRunLoopModes:(NSArray *)runLoopModes;
  242.           - (BOOL)addRunLoopMode:(NSString *)runLoopMode;
  243.           - (BOOL)removeRunLoopMode:(NSString *)runLoopMode;
  244.            允许你配置 socket 使用的 运行循环模式
  245.            运行循环模式设置默认是NSRunLoopCommonModes
  246.            如果你想你的socket 在其他模式下继续操作,你可能需要添加模式 NSModalPanelRunLoopMode 或者 NSEventTrackingRunLoopMode ,或者你可能只想使用 NSRunLoopCommonModes
  247.            可接受的socket将自动 继承相同的运行循环模式就像侦听socket
  248.            注意:NSRunLoopCommonModes 定义在10.5,对于之前的版本可使用 kCFRunLoopCommonModes

  249.  
  250.           -(NSArray *)runLoopModes
  251.             返回当前正在运行的循环模式的AsyncSocket实例, run loop modes的默认设置是NSDefaultRunLoopMode

  252.  
  253.           -(NSData *)unreadData;
  254.          一个错误的事件,在 onSocket:willDisconnectWithError: 将会被调用 去读取留在socket上的任何数据

  255.  
  256.           + (NSData *)CRLFData;   // 0x0D0A
  257.   

  258.  

  259.  

  260.  
  261. 各方法的解析
  262.        -(void)onSocket:(AsyncSocket *)sock willDisconnectWithError:(NSError *)err;   
  263.        发生错误,socket关闭,可以在call-back过程调用"unreadData"去取得socket的最后的数据字节,当连接的时候,该委托方法在    onSocket:didAcceptNewSocket: 或者 onSocket:didConnectToHost: 之前调用

  264.  
  265.       -(void)onSocketDidDisconnect:(ASyncSocket *)sock;
  266.       当socket由于或没有错误而断开连接,如果你想要在断开连接后release socket,在此方法工作,而在onSocket:willDisconnectWithError 释放则不安全

  267.  
  268.        -(void)onSocket:(AsyncSocket *)sock didAcceptNewSocket:(AsyncSocket *)newSocket;
  269.         当产生一个socket去处理连接时调用,此方法会返回 线程上的run-loop 的新的socket和其应处理的委托,如果省略,则使用[NSRunLoop cunrrentRunLoop]

  270.  
  271.           -(BOOL)onSocketWillConnect:(AsyncSocket *)sock;

  272.  
  273.        -(void)onSocket:(AsyncSocket *)sock didConnectToHost :(NSString *)host port:(UINt16)port;
  274.           当socket连接正准备读和写的时候调用,host属性是一个IP地址,而不是一个DNS 名称

  275.  
  276.          -(void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long) tag;
  277.          当socket已完成所要求的数据读入内存时调用,如果有错误则不调用

  278.  
  279.          -(void)onSocket:(Asyncsocket *)sock didReadPartialDataOfLength:(NSUInteger)partiaLength tag:(long)tag;
  280.            当一个socket读取数据,但尚未完成读操作的时候调用,如果使用 readToData: or readToLength: 方法 会发生,可以被用来更新进度条等东西

  281.  
  282.             -(void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag;
  283.              当一个socket已完成请求数据的写入时候调用

  284.  
  285.             -(void)onSocket:(AsyncSocket *)sock didWritePartialDataOfLength:(NSUInteger)partialLength tag:(long)tag;
  286.              当一个socket写入一些数据,但还没有完成整个写入时调用,它可以用来更新进度条等东西

  287.  
  288.                -(NSTimeInterval)onSocket:(AsyncSocket *)sock shouldTimeoutReadWithTag:(long)tag elapsed:(NSTimeInterval)exapsed bytesDone:(NSUInteger)length
  289.               使用读操作已超时但还没完成时调用,此方法允许随意延迟超时,如果返回一个正的时间间隔,读取的超时将有一定量的扩展,如果不实现这个方法,或会像往常一样返回一个负的时间间隔,elapsed参数是  原超时的总和,加上先前通过这种方法添加的任何补充, length参数是 读操作到目前为止已读取的字节数, 注意,如果返回正数的话,这个方法可能被一个单独的读取多次调用

  290.  
  291.                -(NSTimeInterval)onSocket:(AsyncSocket *)sock shouldTimeoutWriteWithTag:(long)tag elapsed:(NSTimeInterval)elapsed bytesDone:(NSUInteger)length;
  292.                 如果一个写操作已达到其超时但还没完成时调用,同上

  293.  
  294.                -(void)onSocketDidSecure:(AsyncSocket *)sock;
  295.                在socket成功完成ssl/tls协商时调用,此方法除非你使用提供startTLS方法时候才调用,
  296.     如果ssl/tls是无效的证书,socket将会立即关闭,onSocket:willDisconnectWithError:代理方法竟会与特定的ssl错误代码一起调用

  297.  
  298.                -(BOOL)canSafelySetDelegate
  299.                用来查看在改变它之前,是否带有与当前的委托有悬而未决的业务(读/写)。当然,应在安全连接或接受委托之前改变委托

  300.  
  301.               一旦接收或连接方法之一被调用,AsyncSocket实例会被锁定,其他接收/连接方法在没有先断开socket不会被调用
  302.               如果尝试失败或超时,这些方法要么返回NO 要么调用 onSocket:willDisconnectWithError: 或 onSockedDidDisconnect
  303.               当传入的连接被接受,AsyncSocket调用多个委托方法。这些方法按照时间顺序排列:
  304.                  1.onSocket:didAcceptNewSocket:
  305.                  2.onSocket:wantsRunLoopForNewSocket:
  306.                  3. onSocketWillConnect:
  307.                
  308.               你的服务器的代码将需要保留公认的socket(如果要接受它),最好的地方是要做到这一点可能在onSocket:didAcceptNewSocket:方法    
  309.              在读和写流已经为新接受的socket设置,onSocket:didConnectToHost:port 方法将在适当的运行循环调用
  310.              多线程注意,如果要想通过实施onSocket:wantsRunLoopForNewSocket:,移动另一个新接受的socket去到另一个循环的socket。然后,应该在调用读和写或者startTLS方法前,等待直到onSocket:didConnectToHost:port:方法。否则读和写时间原定于不正确的runloop,混乱可能会随之而来

  311.  

  312.  
  313.              -(BOOL)acceptOnPort:(UInit16)port error:(NSError **)errPtr;
  314.              告诉socket开始听取和接受制定端口上的连接,当一个连接到来的时候,AsyncSocket实例将调用各种委托方法,socket将听取所有可用的接口(wifi,以太网等)

  315.  
  316.              -(BOOL)connectToHost:(NSString *)hostname onPort:(UInt16)port error :(NSError **)errPtr;
  317.              连接给定的主机和端口,主机hostname可以是域名或者是Ip地址

  318.  
  319.              -(BOOL)connectToAddress:(NSData *)remoteAddr error:(NSError *)errPtr;
  320.              连接到一个给定的地址,制定一个sockaddr结构包裹住一个NSData对象,例如,NSData对象从NSNetService的地址方法返回,如果有一个现有的sockaddr结构,可以将它转换到一个NSData对象,像这样:
  321.  struct sockaddr sa  -> NSData *dsa = [NSData dataWithBytes:&remoteAddr length:remoteAddr.sa_len];
  322.  struct sockaddr *sa -> NSData *dsa = [NSData dataWithBytes:remoteAddr length:remoteAddr->sa_len];

  323.  
  324.              -(void)disconnect;
  325.                 立即断开,任何未处理的读或写都将被丢弃
  326.                 如果socket还没有断开,在这个方法返回之前,onSocketDidDisconnect 委托方法将会被立即调用
  327.                  注意推荐释放AsyncSocket实例的方式:
  328.                    [asyncSocket setDelegate:nil];
  329.                    [asyncSocket disconnect];
  330.                    [asyncSocket release];

  331.  
  332.               -(void)disconnectAfterReading;
  333.                  在已经完成了所有悬而未决的读取时 断开,在调用之后,读取和写入方法将无用,socket将断开 即使仍有待写入

  334.  
  335.               - (NSString *)connectedHost;
  336.               - (UInt16)connectedPort;
  337.               - (NSString *)localHost;
  338.               - (UInt16)localPort;
  339.                 返回本地和远程主机和端口给连接的socket,如果没有连接会返回nil或0,主机将会是一个IP地址

  340.  
  341.              -(NSData *)connectedAddress
  342.              -(NSData *)localAddresss
  343.                 返回本地和远程的地址给连接的socket,指定一个socketaddr结构包裹在一个NSData对象

  344.  

  345.  
  346.                 readData和writeData方法不会是block(它们是异步的)
  347.                当读完成 onSocket:didReadData:withTag: 委托方法时调用
  348.                当写完成 onSocket:didWriteDataWithTag: 委托方法时调用
  349.                可以选择任何读/写操作的超时设置(为了不超时,使用负时间间隔。)
  350.                如果读/写操作超时,相应的 onSocket:shouldTimeout...委托方法被调用去选择性地允许我们去延长超时
  351.                超时后,onSocket:willDisconnectWithError: 方法被调用,紧接着是 onSocketDidDisconnect
  352.                tag是为了方便,可以使用它作为数组的索引、步数、state id 、指针等 

  353.  

  354.  

  355.  
  356.             -(void)readDataWithTimeout:(NSTimeInterval)tiemout tag:(long)tag;
  357.               读取socket上第一次成为可用的字节,如果timeout值是负数的,读操作将不使用timeout

  358.  
  359.             - (void)readDataWithTimeout:(NSTimeInterval)timeout buffer:(NSMutableData *)buffer bufferOffset:(NSUInterger)offset tag:(long)tag;
  360.               读取socket上第一次成为可用的字节
  361.               字节将被追加到给定的字节缓冲区,从给定的偏移量开始
  362.               如果需要,给定的缓冲区大小将会自动增加
  363.               如果timeout值是负数的,读操作将不使用timeout
  364.               如果缓冲区为空,socket会为我们创建一个缓冲区
  365.               如果bufferOffset是大于给定的缓冲区的长度,该方法将无用,委托将不会被调用
  366.               如果你传递一个缓冲区,当AsyncSocket在使用它的时候你不能以任何方式改变它
  367.               完成之后,onSocket:didReadData:withTag 返回的数据将是一个给定的缓冲区的子集
  368.               也就是说,它将会被引用到被追加的给定的缓冲区的字节

  369.  
  370.             -(void)readDataToLength:(NSUInterger)length withTimeout:(NSTimeInterval)timeout tag:(long)tag;
  371.             读取给定的字节数,如果length为0,方法将无用,委托将不会被调用

  372.  
  373.             -(void)readDataToLength:(NSUInteger)length withTimeout:(NSTimeInterval)tiemout buffer:(NSMutableData *)buffer bufferOffset:(NSUInteger) offset tag:(long)tag;
  374.             读取给定的字节数,在给定的偏移开始,字节将被追加到给定的字节缓冲区

  375.  
  376.             -(void)readDataToData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag;
  377.             读取字节直到(包括)传入的作为分隔的"data"参数
  378.             如果传递0或者0长度的数据,"data"参数,该方法将无用,委托将不会被调用
  379.             从socket读取一行,使用"data"参数作为行的分隔符 (如HTTP的CRLF)
  380.             注意,此方法不是字符集,因此,如果一个分隔符出现,它自然可以作为进行编码的一部分,读取将提前结束

  381.  
  382.             -(void)readDataToData:(NSData *)data withTimeout:(NSTimeInterval)timeout buffer:(NSMutableData *)buffer bufferOffset:(NSUInteger) offset tag:(long)tag;
  383.            读取字节直到(包括)传入的作为分隔的“data”参数,在给定的偏移量开始,字节将被追加到给定的字节缓冲区。
  384.            从socket读取一行,使用"data"参数作为行的分隔符(如HTTP的CRLF)

  385.  
  386.            -(void)writeData:(NSData *)data withTimeout:(NSTimeInterval) timeout tag:(long)tag;
  387.           将data写入socket,当完成的时候委托被调用 

  388.  
  389.            - (float)progressOfReadReturningTag:(long *)tag bytesDone:(NSUInteger *)done total:(NSUInteger *)total;
  390.            - (float)progressOfWriteReturningTag:(long *)tag bytesDone:(NSUInteger *)done total:(NSUInteger *)total;
  391.            返回当前读或写的进度,从0.0 到 1.0 或者 如果没有读/写的时候返回Nan(使用isNan来检查)
  392.    tag、done、total如果不为空的话,它们将会被填补

  393.  
  394.            

  395.  
  396.            - (void)startTLS:(NSDictionary *)tlsSettings;
  397.            确保使用ssl/tls连接
  398.            这方法可被随时调用,tls握手将会发生在所有悬而未决的读/写完成之后。这紧跟着一个发送依赖 StartTLS消息的协议选项,在排队升级到TLS的同一时间,而不必等待写入完成。在这个方法被调用后,任何读写计划 将会发生在安全链接
  399.            对于可能的keys和TLS设置的值是有据可查的
  400.            一些可能的keys是:
  401.               * - kCFStreamSSLLevel
  402.               * - kCFStreamSSLAllowsExpiredCertificates
  403.               * - kCFStreamSSLAllowsExpiredRoots
  404.               * - kCFStreamSSLAllowsAnyRoot
  405.               * - kCFStreamSSLValidatesCertificateChain
  406.               * - kCFStreamSSLPeerName
  407.               * - kCFStreamSSLCertificates
  408.               * - kCFStreamSSLIsServer

  409.  
  410.            如果你传递空或者空字典,将使用默认的字典
  411.            默认设置将检查以确保由签署可信的第三方证书机构和没有过期的远程连接的证书
  412.            然而,它不会验证证书上的名字,除非你给它一个名字,通过kCFStreamSSLPeerName键去验证
  413.            这对安全的影响是重要的理解
  414.            想象一下你正试图创建一个到MySecureServer.com的安全连接,但因为一个被攻击的DNS服务器,所以你的socket被定向到MaliciousServer.com
  415.            如果你只是使用默认设置,MaliciousServer.com 有一个有效的证书
  416.            默认设置将无法监测到任何问题,因为证书是有效的
  417.           在这个特殊的情况下,要妥善保护你的连接,应设置kCFStreamSSLPeerName性质为MySecureServer.com.
  418.          如果事前你不知道对等的名字的远程主机(例如,你不确认它是domain.com" or "www.domain.com"),那么你可以使用默认设置来验证证书,然后在获得验证的发行后使用X509Certificate类来验证,X509Certificate类的CocoaAsyncSocket开源项目的一部分

  419.  
  420.          -(void)enablePrebuffering
  421.          对于处理readDataToData请求,数据是必须从socket以小增量的方式读取出来的
  422.          性能通过允许AsyncSocket去一次性读大块的数据和存储任何一个小的内部缓冲区溢出的东西来大大提高
  423.          这被称为预缓冲,就好像一些数据在你要求它之前就可能被读取出来
  424.          如果你经常使用readDataToData,使用预缓冲会有更好的性能,尤其是在iphone上
  425.          默认的预缓冲状态是由DEFAULT_PREBUFFERING 定义控制的,强烈建议设置其为yes
  426.          这方法存在一些预缓冲需要一些不可预见的原因被默认禁用的情况,这时,这种方法存在允许当就绪时,可轻松启用预缓冲

  427.  
  428.           -(BOOL)moveToRunLoop:(NSRunLoop *)runLoop;
  429.           当你创建一个AsyncSocket,它被添加到当前线程runloop
  430.           对于手动创建的socket,在线程上你打算使用它,它是最容易简单的创建的线程上的socket
  431.           当一个新的socket被接受,委托方法 onSocket:wantsRunLoopForNewSocket 会被调用 允许你在一个单独的线程上放置socket,这个工作最好结合在同一个线程池设计
  432.           如果,但是,在一个单独的线程上,在之后的时间,你需要移动一个socket,这个方法可以用来完成任务
  433.           此方法必须从 当前运行的 线程/runloop 的socket 调用
  434.           注意:此方法调用后,所有进一步的方法应该从给定的runloop上调用这个对象
  435.           此外,所有委托调用将会发送到给定的runloop

  436.  

  437.  
  438.           - (BOOL)setRunLoopModes:(NSArray *)runLoopModes;
  439.           - (BOOL)addRunLoopMode:(NSString *)runLoopMode;
  440.           - (BOOL)removeRunLoopMode:(NSString *)runLoopMode;
  441.            允许你配置 socket 使用的 运行循环模式
  442.            运行循环模式设置默认是NSRunLoopCommonModes
  443.            如果你想你的socket 在其他模式下继续操作,你可能需要添加模式 NSModalPanelRunLoopMode 或者 NSEventTrackingRunLoopMode ,或者你可能只想使用 NSRunLoopCommonModes
  444.            可接受的socket将自动 继承相同的运行循环模式就像侦听socket
  445.            注意:NSRunLoopCommonModes 定义在10.5,对于之前的版本可使用 kCFRunLoopCommonModes

  446.  
  447.           -(NSArray *)runLoopModes
  448.             返回当前正在运行的循环模式的AsyncSocket实例, run loop modes的默认设置是NSDefaultRunLoopMode

  449.  
  450.           -(NSData *)unreadData;
  451.          一个错误的事件,在 onSocket:willDisconnectWithError: 将会被调用 去读取留在socket上的任何数据

  452.  
  453.           + (NSData *)CRLFData;   // 0x0D0A
  454.   

  455.  

  456.  
  457. 各方法的解析
  458.        -(void)onSocket:(AsyncSocket *)sock willDisconnectWithError:(NSError *)err;   
  459.        发生错误,socket关闭,可以在call-back过程调用"unreadData"去取得socket的最后的数据字节,当连接的时候,该委托方法在    onSocket:didAcceptNewSocket: 或者 onSocket:didConnectToHost: 之前调用

  460.  
  461.       -(void)onSocketDidDisconnect:(ASyncSocket *)sock;
  462.       当socket由于或没有错误而断开连接,如果你想要在断开连接后release socket,在此方法工作,而在onSocket:willDisconnectWithError 释放则不安全

  463.  
  464.        -(void)onSocket:(AsyncSocket *)sock didAcceptNewSocket:(AsyncSocket *)newSocket;
  465.         当产生一个socket去处理连接时调用,此方法会返回 线程上的run-loop 的新的socket和其应处理的委托,如果省略,则使用[NSRunLoop cunrrentRunLoop]

  466.  
  467.           -(BOOL)onSocketWillConnect:(AsyncSocket *)sock;

  468.  
  469.        -(void)onSocket:(AsyncSocket *)sock didConnectToHost :(NSString *)host port:(UINt16)port;
  470.           当socket连接正准备读和写的时候调用,host属性是一个IP地址,而不是一个DNS 名称

  471.  
  472.          -(void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long) tag;
  473.          当socket已完成所要求的数据读入内存时调用,如果有错误则不调用

  474.  
  475.          -(void)onSocket:(Asyncsocket *)sock didReadPartialDataOfLength:(NSUInteger)partiaLength tag:(long)tag;
  476.            当一个socket读取数据,但尚未完成读操作的时候调用,如果使用 readToData: or readToLength: 方法 会发生,可以被用来更新进度条等东西

  477.  
  478.             -(void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag;
  479.              当一个socket已完成请求数据的写入时候调用

  480.  
  481.             -(void)onSocket:(AsyncSocket *)sock didWritePartialDataOfLength:(NSUInteger)partialLength tag:(long)tag;
  482.              当一个socket写入一些数据,但还没有完成整个写入时调用,它可以用来更新进度条等东西

  483.  
  484.                -(NSTimeInterval)onSocket:(AsyncSocket *)sock shouldTimeoutReadWithTag:(long)tag elapsed:(NSTimeInterval)exapsed bytesDone:(NSUInteger)length
  485.               使用读操作已超时但还没完成时调用,此方法允许随意延迟超时,如果返回一个正的时间间隔,读取的超时将有一定量的扩展,如果不实现这个方法,或会像往常一样返回一个负的时间间隔,elapsed参数是  原超时的总和,加上先前通过这种方法添加的任何补充, length参数是 读操作到目前为止已读取的字节数, 注意,如果返回正数的话,这个方法可能被一个单独的读取多次调用

  486.  
  487.                -(NSTimeInterval)onSocket:(AsyncSocket *)sock shouldTimeoutWriteWithTag:(long)tag elapsed:(NSTimeInterval)elapsed bytesDone:(NSUInteger)length;
  488.                 如果一个写操作已达到其超时但还没完成时调用,同上

  489.  
  490.                -(void)onSocketDidSecure:(AsyncSocket *)sock;
  491.                在socket成功完成ssl/tls协商时调用,此方法除非你使用提供startTLS方法时候才调用,
  492.     如果ssl/tls是无效的证书,socket将会立即关闭,onSocket:willDisconnectWithError:代理方法竟会与特定的ssl错误代码一起调用

  493.  
  494.                -(BOOL)canSafelySetDelegate
  495.                用来查看在改变它之前,是否带有与当前的委托有悬而未决的业务(读/写)。当然,应在安全连接或接受委托之前改变委托

  496.  
  497.               一旦接收或连接方法之一被调用,AsyncSocket实例会被锁定,其他接收/连接方法在没有先断开socket不会被调用
  498.               如果尝试失败或超时,这些方法要么返回NO 要么调用 onSocket:willDisconnectWithError: 或 onSockedDidDisconnect
  499.               当传入的连接被接受,AsyncSocket调用多个委托方法。这些方法按照时间顺序排列:
  500.                  1.onSocket:didAcceptNewSocket:
  501.                  2.onSocket:wantsRunLoopForNewSocket:
  502.                  3. onSocketWillConnect:
  503.                
  504.               你的服务器的代码将需要保留公认的socket(如果要接受它),最好的地方是要做到这一点可能在onSocket:didAcceptNewSocket:方法    
  505.              在读和写流已经为新接受的socket设置,onSocket:didConnectToHost:port 方法将在适当的运行循环调用
  506.              多线程注意,如果要想通过实施onSocket:wantsRunLoopForNewSocket:,移动另一个新接受的socket去到另一个循环的socket。然后,应该在调用读和写或者startTLS方法前,等待直到onSocket:didConnectToHost:port:方法。否则读和写时间原定于不正确的runloop,混乱可能会随之而来

  507.  

  508.  
  509.              -(BOOL)acceptOnPort:(UInit16)port error:(NSError **)errPtr;
  510.              告诉socket开始听取和接受制定端口上的连接,当一个连接到来的时候,AsyncSocket实例将调用各种委托方法,socket将听取所有可用的接口(wifi,以太网等)

  511.  
  512.              -(BOOL)connectToHost:(NSString *)hostname onPort:(UInt16)port error :(NSError **)errPtr;
  513.              连接给定的主机和端口,主机hostname可以是域名或者是Ip地址

  514.  
  515.              -(BOOL)connectToAddress:(NSData *)remoteAddr error:(NSError *)errPtr;
  516.              连接到一个给定的地址,制定一个sockaddr结构包裹住一个NSData对象,例如,NSData对象从NSNetService的地址方法返回,如果有一个现有的sockaddr结构,可以将它转换到一个NSData对象,像这样:
  517.  struct sockaddr sa  -> NSData *dsa = [NSData dataWithBytes:&remoteAddr length:remoteAddr.sa_len];
  518.  struct sockaddr *sa -> NSData *dsa = [NSData dataWithBytes:remoteAddr length:remoteAddr->sa_len];

  519.  
  520.              -(void)disconnect;
  521.                 立即断开,任何未处理的读或写都将被丢弃
  522.                 如果socket还没有断开,在这个方法返回之前,onSocketDidDisconnect 委托方法将会被立即调用
  523.                  注意推荐释放AsyncSocket实例的方式:
  524.                    [asyncSocket setDelegate:nil];
  525.                    [asyncSocket disconnect];
  526.                    [asyncSocket release];

  527.  
  528.               -(void)disconnectAfterReading;
  529.                  在已经完成了所有悬而未决的读取时 断开,在调用之后,读取和写入方法将无用,socket将断开 即使仍有待写入

  530.  
  531.               - (NSString *)connectedHost;
  532.               - (UInt16)connectedPort;
  533.               - (NSString *)localHost;
  534.               - (UInt16)localPort;
  535.                 返回本地和远程主机和端口给连接的socket,如果没有连接会返回nil或0,主机将会是一个IP地址

  536.  
  537.              -(NSData *)connectedAddress
  538.              -(NSData *)localAddresss
  539.                 返回本地和远程的地址给连接的socket,指定一个socketaddr结构包裹在一个NSData对象

  540.  

  541.  
  542.                 readData和writeData方法不会是block(它们是异步的)
  543.                当读完成 onSocket:didReadData:withTag: 委托方法时调用
  544.                当写完成 onSocket:didWriteDataWithTag: 委托方法时调用
  545.                可以选择任何读/写操作的超时设置(为了不超时,使用负时间间隔。)
  546.                如果读/写操作超时,相应的 onSocket:shouldTimeout...委托方法被调用去选择性地允许我们去延长超时
  547.                超时后,onSocket:willDisconnectWithError: 方法被调用,紧接着是 onSocketDidDisconnect
  548.                tag是为了方便,可以使用它作为数组的索引、步数、state id 、指针等 

  549.  

  550.  

  551.  
  552.             -(void)readDataWithTimeout:(NSTimeInterval)tiemout tag:(long)tag;
  553.               读取socket上第一次成为可用的字节,如果timeout值是负数的,读操作将不使用timeout

  554.  
  555.             - (void)readDataWithTimeout:(NSTimeInterval)timeout buffer:(NSMutableData *)buffer bufferOffset:(NSUInterger)offset tag:(long)tag;
  556.               读取socket上第一次成为可用的字节
  557.               字节将被追加到给定的字节缓冲区,从给定的偏移量开始
  558.               如果需要,给定的缓冲区大小将会自动增加
  559.               如果timeout值是负数的,读操作将不使用timeout
  560.               如果缓冲区为空,socket会为我们创建一个缓冲区
  561.               如果bufferOffset是大于给定的缓冲区的长度,该方法将无用,委托将不会被调用
  562.               如果你传递一个缓冲区,当AsyncSocket在使用它的时候你不能以任何方式改变它
  563.               完成之后,onSocket:didReadData:withTag 返回的数据将是一个给定的缓冲区的子集
  564.               也就是说,它将会被引用到被追加的给定的缓冲区的字节

  565.  
  566.             -(void)readDataToLength:(NSUInterger)length withTimeout:(NSTimeInterval)timeout tag:(long)tag;
  567.             读取给定的字节数,如果length为0,方法将无用,委托将不会被调用

  568.  
  569.             -(void)readDataToLength:(NSUInteger)length withTimeout:(NSTimeInterval)tiemout buffer:(NSMutableData *)buffer bufferOffset:(NSUInteger) offset tag:(long)tag;
  570.             读取给定的字节数,在给定的偏移开始,字节将被追加到给定的字节缓冲区

  571.  
  572.             -(void)readDataToData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag;
  573.             读取字节直到(包括)传入的作为分隔的"data"参数
  574.             如果传递0或者0长度的数据,"data"参数,该方法将无用,委托将不会被调用
  575.             从socket读取一行,使用"data"参数作为行的分隔符 (如HTTP的CRLF)
  576.             注意,此方法不是字符集,因此,如果一个分隔符出现,它自然可以作为进行编码的一部分,读取将提前结束

  577.  
  578.             -(void)readDataToData:(NSData *)data withTimeout:(NSTimeInterval)timeout buffer:(NSMutableData *)buffer bufferOffset:(NSUInteger) offset tag:(long)tag;
  579.            读取字节直到(包括)传入的作为分隔的“data”参数,在给定的偏移量开始,字节将被追加到给定的字节缓冲区。
  580.            从socket读取一行,使用"data"参数作为行的分隔符(如HTTP的CRLF)

  581.  
  582.            -(void)writeData:(NSData *)data withTimeout:(NSTimeInterval) timeout tag:(long)tag;
  583.           将data写入socket,当完成的时候委托被调用 

  584.  
  585.            - (float)progressOfReadReturningTag:(long *)tag bytesDone:(NSUInteger *)done total:(NSUInteger *)total;
  586.            - (float)progressOfWriteReturningTag:(long *)tag bytesDone:(NSUInteger *)done total:(NSUInteger *)total;
  587.            返回当前读或写的进度,从0.0 到 1.0 或者 如果没有读/写的时候返回Nan(使用isNan来检查)
  588.    tag、done、total如果不为空的话,它们将会被填补

  589.  
  590.            

  591.  
  592.            - (void)startTLS:(NSDictionary *)tlsSettings;
  593.            确保使用ssl/tls连接
  594.            这方法可被随时调用,tls握手将会发生在所有悬而未决的读/写完成之后。这紧跟着一个发送依赖 StartTLS消息的协议选项,在排队升级到TLS的同一时间,而不必等待写入完成。在这个方法被调用后,任何读写计划 将会发生在安全链接
  595.            对于可能的keys和TLS设置的值是有据可查的
  596.            一些可能的keys是:
  597.               * - kCFStreamSSLLevel
  598.               * - kCFStreamSSLAllowsExpiredCertificates
  599.               * - kCFStreamSSLAllowsExpiredRoots
  600.               * - kCFStreamSSLAllowsAnyRoot
  601.               * - kCFStreamSSLValidatesCertificateChain
  602.               * - kCFStreamSSLPeerName
  603.               * - kCFStreamSSLCertificates
  604.               * - kCFStreamSSLIsServer

  605.  
  606.            如果你传递空或者空字典,将使用默认的字典
  607.            默认设置将检查以确保由签署可信的第三方证书机构和没有过期的远程连接的证书
  608.            然而,它不会验证证书上的名字,除非你给它一个名字,通过kCFStreamSSLPeerName键去验证
  609.            这对安全的影响是重要的理解
  610.            想象一下你正试图创建一个到MySecureServer.com的安全连接,但因为一个被攻击的DNS服务器,所以你的socket被定向到MaliciousServer.com
  611.            如果你只是使用默认设置,MaliciousServer.com 有一个有效的证书
  612.            默认设置将无法监测到任何问题,因为证书是有效的
  613.           在这个特殊的情况下,要妥善保护你的连接,应设置kCFStreamSSLPeerName性质为MySecureServer.com.
  614.          如果事前你不知道对等的名字的远程主机(例如,你不确认它是domain.com" or "www.domain.com"),那么你可以使用默认设置来验证证书,然后在获得验证的发行后使用X509Certificate类来验证,X509Certificate类的CocoaAsyncSocket开源项目的一部分

  615.  
  616.          -(void)enablePrebuffering
  617.          对于处理readDataToData请求,数据是必须从socket以小增量的方式读取出来的
  618.          性能通过允许AsyncSocket去一次性读大块的数据和存储任何一个小的内部缓冲区溢出的东西来大大提高
  619.          这被称为预缓冲,就好像一些数据在你要求它之前就可能被读取出来
  620.          如果你经常使用readDataToData,使用预缓冲会有更好的性能,尤其是在iphone上
  621.          默认的预缓冲状态是由DEFAULT_PREBUFFERING 定义控制的,强烈建议设置其为yes
  622.          这方法存在一些预缓冲需要一些不可预见的原因被默认禁用的情况,这时,这种方法存在允许当就绪时,可轻松启用预缓冲

  623.  
  624.           -(BOOL)moveToRunLoop:(NSRunLoop *)runLoop;
  625.           当你创建一个AsyncSocket,它被添加到当前线程runloop
  626.           对于手动创建的socket,在线程上你打算使用它,它是最容易简单的创建的线程上的socket
  627.           当一个新的socket被接受,委托方法 onSocket:wantsRunLoopForNewSocket 会被调用 允许你在一个单独的线程上放置socket,这个工作最好结合在同一个线程池设计
  628.           如果,但是,在一个单独的线程上,在之后的时间,你需要移动一个socket,这个方法可以用来完成任务
  629.           此方法必须从 当前运行的 线程/runloop 的socket 调用
  630.           注意:此方法调用后,所有进一步的方法应该从给定的runloop上调用这个对象
  631.           此外,所有委托调用将会发送到给定的runloop

  632.  

  633.  
  634.           - (BOOL)setRunLoopModes:(NSArray *)runLoopModes;
  635.           - (BOOL)addRunLoopMode:(NSString *)runLoopMode;
  636.           - (BOOL)removeRunLoopMode:(NSString *)runLoopMode;
  637.            允许你配置 socket 使用的 运行循环模式
  638.            运行循环模式设置默认是NSRunLoopCommonModes
  639.            如果你想你的socket 在其他模式下继续操作,你可能需要添加模式 NSModalPanelRunLoopMode 或者 NSEventTrackingRunLoopMode ,或者你可能只想使用 NSRunLoopCommonModes
  640.            可接受的socket将自动 继承相同的运行循环模式就像侦听socket
  641.            注意:NSRunLoopCommonModes 定义在10.5,对于之前的版本可使用 kCFRunLoopCommonModes

  642.  
  643.           -(NSArray *)runLoopModes
  644.             返回当前正在运行的循环模式的AsyncSocket实例, run loop modes的默认设置是NSDefaultRunLoopMode

  645.  
  646.           -(NSData *)unreadData;
  647.          一个错误的事件,在 onSocket:willDisconnectWithError: 将会被调用 去读取留在socket上的任何数据

  648.  
  649.           + (NSData *)CRLFData;   // 0x0D0A
  650.   

  651.  
  652. 各方法的解析
  653.        -(void)onSocket:(AsyncSocket *)sock willDisconnectWithError:(NSError *)err;   
  654.        发生错误,socket关闭,可以在call-back过程调用"unreadData"去取得socket的最后的数据字节,当连接的时候,该委托方法在    onSocket:didAcceptNewSocket: 或者 onSocket:didConnectToHost: 之前调用

  655.  
  656.       -(void)onSocketDidDisconnect:(ASyncSocket *)sock;
  657.       当socket由于或没有错误而断开连接,如果你想要在断开连接后release socket,在此方法工作,而在onSocket:willDisconnectWithError 释放则不安全

  658.  
  659.        -(void)onSocket:(AsyncSocket *)sock didAcceptNewSocket:(AsyncSocket *)newSocket;
  660.         当产生一个socket去处理连接时调用,此方法会返回 线程上的run-loop 的新的socket和其应处理的委托,如果省略,则使用[NSRunLoop cunrrentRunLoop]

  661.  
  662.           -(BOOL)onSocketWillConnect:(AsyncSocket *)sock;

  663.  
  664.        -(void)onSocket:(AsyncSocket *)sock didConnectToHost :(NSString *)host port:(UINt16)port;
  665.           当socket连接正准备读和写的时候调用,host属性是一个IP地址,而不是一个DNS 名称

  666.  
  667.          -(void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long) tag;
  668.          当socket已完成所要求的数据读入内存时调用,如果有错误则不调用

  669.  
  670.          -(void)onSocket:(Asyncsocket *)sock didReadPartialDataOfLength:(NSUInteger)partiaLength tag:(long)tag;
  671.            当一个socket读取数据,但尚未完成读操作的时候调用,如果使用 readToData: or readToLength: 方法 会发生,可以被用来更新进度条等东西

  672.  
  673.             -(void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag;
  674.              当一个socket已完成请求数据的写入时候调用

  675.  
  676.             -(void)onSocket:(AsyncSocket *)sock didWritePartialDataOfLength:(NSUInteger)partialLength tag:(long)tag;
  677.              当一个socket写入一些数据,但还没有完成整个写入时调用,它可以用来更新进度条等东西

  678.  
  679.                -(NSTimeInterval)onSocket:(AsyncSocket *)sock shouldTimeoutReadWithTag:(long)tag elapsed:(NSTimeInterval)exapsed bytesDone:(NSUInteger)length
  680.               使用读操作已超时但还没完成时调用,此方法允许随意延迟超时,如果返回一个正的时间间隔,读取的超时将有一定量的扩展,如果不实现这个方法,或会像往常一样返回一个负的时间间隔,elapsed参数是  原超时的总和,加上先前通过这种方法添加的任何补充, length参数是 读操作到目前为止已读取的字节数, 注意,如果返回正数的话,这个方法可能被一个单独的读取多次调用

  681.  
  682.                -(NSTimeInterval)onSocket:(AsyncSocket *)sock shouldTimeoutWriteWithTag:(long)tag elapsed:(NSTimeInterval)elapsed bytesDone:(NSUInteger)length;
  683.                 如果一个写操作已达到其超时但还没完成时调用,同上

  684.  
  685.                -(void)onSocketDidSecure:(AsyncSocket *)sock;
  686.                在socket成功完成ssl/tls协商时调用,此方法除非你使用提供startTLS方法时候才调用,
  687.     如果ssl/tls是无效的证书,socket将会立即关闭,onSocket:willDisconnectWithError:代理方法竟会与特定的ssl错误代码一起调用

  688.  
  689.                -(BOOL)canSafelySetDelegate
  690.                用来查看在改变它之前,是否带有与当前的委托有悬而未决的业务(读/写)。当然,应在安全连接或接受委托之前改变委托

  691.  
  692.               一旦接收或连接方法之一被调用,AsyncSocket实例会被锁定,其他接收/连接方法在没有先断开socket不会被调用
  693.               如果尝试失败或超时,这些方法要么返回NO 要么调用 onSocket:willDisconnectWithError: 或 onSockedDidDisconnect
  694.               当传入的连接被接受,AsyncSocket调用多个委托方法。这些方法按照时间顺序排列:
  695.                  1.onSocket:didAcceptNewSocket:
  696.                  2.onSocket:wantsRunLoopForNewSocket:
  697.                  3. onSocketWillConnect:
  698.                
  699.               你的服务器的代码将需要保留公认的socket(如果要接受它),最好的地方是要做到这一点可能在onSocket:didAcceptNewSocket:方法    
  700.              在读和写流已经为新接受的socket设置,onSocket:didConnectToHost:port 方法将在适当的运行循环调用
  701.              多线程注意,如果要想通过实施onSocket:wantsRunLoopForNewSocket:,移动另一个新接受的socket去到另一个循环的socket。然后,应该在调用读和写或者startTLS方法前,等待直到onSocket:didConnectToHost:port:方法。否则读和写时间原定于不正确的runloop,混乱可能会随之而来

  702.  

  703.  
  704.              -(BOOL)acceptOnPort:(UInit16)port error:(NSError **)errPtr;
  705.              告诉socket开始听取和接受制定端口上的连接,当一个连接到来的时候,AsyncSocket实例将调用各种委托方法,socket将听取所有可用的接口(wifi,以太网等)

  706.  
  707.              -(BOOL)connectToHost:(NSString *)hostname onPort:(UInt16)port error :(NSError **)errPtr;
  708.              连接给定的主机和端口,主机hostname可以是域名或者是Ip地址

  709.  
  710.              -(BOOL)connectToAddress:(NSData *)remoteAddr error:(NSError *)errPtr;
  711.              连接到一个给定的地址,制定一个sockaddr结构包裹住一个NSData对象,例如,NSData对象从NSNetService的地址方法返回,如果有一个现有的sockaddr结构,可以将它转换到一个NSData对象,像这样:
  712.  struct sockaddr sa  -> NSData *dsa = [NSData dataWithBytes:&remoteAddr length:remoteAddr.sa_len];
  713.  struct sockaddr *sa -> NSData *dsa = [NSData dataWithBytes:remoteAddr length:remoteAddr->sa_len];

  714.  
  715.              -(void)disconnect;
  716.                 立即断开,任何未处理的读或写都将被丢弃
  717.                 如果socket还没有断开,在这个方法返回之前,onSocketDidDisconnect 委托方法将会被立即调用
  718.                  注意推荐释放AsyncSocket实例的方式:
  719.                    [asyncSocket setDelegate:nil];
  720.                    [asyncSocket disconnect];
  721.                    [asyncSocket release];

  722.  
  723.               -(void)disconnectAfterReading;
  724.                  在已经完成了所有悬而未决的读取时 断开,在调用之后,读取和写入方法将无用,socket将断开 即使仍有待写入

  725.  
  726.               - (NSString *)connectedHost;
  727.               - (UInt16)connectedPort;
  728.               - (NSString *)localHost;
  729.               - (UInt16)localPort;
  730.                 返回本地和远程主机和端口给连接的socket,如果没有连接会返回nil或0,主机将会是一个IP地址

  731.  
  732.              -(NSData *)connectedAddress
  733.              -(NSData *)localAddresss
  734.                 返回本地和远程的地址给连接的socket,指定一个socketaddr结构包裹在一个NSData对象

  735.  

  736.  
  737.                 readData和writeData方法不会是block(它们是异步的)
  738.                当读完成 onSocket:didReadData:withTag: 委托方法时调用
  739.                当写完成 onSocket:didWriteDataWithTag: 委托方法时调用
  740.                可以选择任何读/写操作的超时设置(为了不超时,使用负时间间隔。)
  741.                如果读/写操作超时,相应的 onSocket:shouldTimeout...委托方法被调用去选择性地允许我们去延长超时
  742.                超时后,onSocket:willDisconnectWithError: 方法被调用,紧接着是 onSocketDidDisconnect
  743.                tag是为了方便,可以使用它作为数组的索引、步数、state id 、指针等 

  744.  

  745.  

  746.  
  747.             -(void)readDataWithTimeout:(NSTimeInterval)tiemout tag:(long)tag;
  748.               读取socket上第一次成为可用的字节,如果timeout值是负数的,读操作将不使用timeout

  749.  
  750.             - (void)readDataWithTimeout:(NSTimeInterval)timeout buffer:(NSMutableData *)buffer bufferOffset:(NSUInterger)offset tag:(long)tag;
  751.               读取socket上第一次成为可用的字节
  752.               字节将被追加到给定的字节缓冲区,从给定的偏移量开始
  753.               如果需要,给定的缓冲区大小将会自动增加
  754.               如果timeout值是负数的,读操作将不使用timeout
  755.               如果缓冲区为空,socket会为我们创建一个缓冲区
  756.               如果bufferOffset是大于给定的缓冲区的长度,该方法将无用,委托将不会被调用
  757.               如果你传递一个缓冲区,当AsyncSocket在使用它的时候你不能以任何方式改变它
  758.               完成之后,onSocket:didReadData:withTag 返回的数据将是一个给定的缓冲区的子集
  759.               也就是说,它将会被引用到被追加的给定的缓冲区的字节

  760.  
  761.             -(void)readDataToLength:(NSUInterger)length withTimeout:(NSTimeInterval)timeout tag:(long)tag;
  762.             读取给定的字节数,如果length为0,方法将无用,委托将不会被调用

  763.  
  764.             -(void)readDataToLength:(NSUInteger)length withTimeout:(NSTimeInterval)tiemout buffer:(NSMutableData *)buffer bufferOffset:(NSUInteger) offset tag:(long)tag;
  765.             读取给定的字节数,在给定的偏移开始,字节将被追加到给定的字节缓冲区

  766.  
  767.             -(void)readDataToData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag;
  768.             读取字节直到(包括)传入的作为分隔的"data"参数
  769.             如果传递0或者0长度的数据,"data"参数,该方法将无用,委托将不会被调用
  770.             从socket读取一行,使用"data"参数作为行的分隔符 (如HTTP的CRLF)
  771.             注意,此方法不是字符集,因此,如果一个分隔符出现,它自然可以作为进行编码的一部分,读取将提前结束

  772.  
  773.             -(void)readDataToData:(NSData *)data withTimeout:(NSTimeInterval)timeout buffer:(NSMutableData *)buffer bufferOffset:(NSUInteger) offset tag:(long)tag;
  774.            读取字节直到(包括)传入的作为分隔的“data”参数,在给定的偏移量开始,字节将被追加到给定的字节缓冲区。
  775.            从socket读取一行,使用"data"参数作为行的分隔符(如HTTP的CRLF)

  776.  
  777.            -(void)writeData:(NSData *)data withTimeout:(NSTimeInterval) timeout tag:(long)tag;
  778.           将data写入socket,当完成的时候委托被调用 

  779.  
  780.            - (float)progressOfReadReturningTag:(long *)tag bytesDone:(NSUInteger *)done total:(NSUInteger *)total;
  781.            - (float)progressOfWriteReturningTag:(long *)tag bytesDone:(NSUInteger *)done total:(NSUInteger *)total;
  782.            返回当前读或写的进度,从0.0 到 1.0 或者 如果没有读/写的时候返回Nan(使用isNan来检查)
  783.    tag、done、total如果不为空的话,它们将会被填补

  784.  
  785.            

  786.  
  787.            - (void)startTLS:(NSDictionary *)tlsSettings;
  788.            确保使用ssl/tls连接
  789.            这方法可被随时调用,tls握手将会发生在所有悬而未决的读/写完成之后。这紧跟着一个发送依赖 StartTLS消息的协议选项,在排队升级到TLS的同一时间,而不必等待写入完成。在这个方法被调用后,任何读写计划 将会发生在安全链接
  790.            对于可能的keys和TLS设置的值是有据可查的
  791.            一些可能的keys是:
  792.               * - kCFStreamSSLLevel
  793.               * - kCFStreamSSLAllowsExpiredCertificates
  794.               * - kCFStreamSSLAllowsExpiredRoots
  795.               * - kCFStreamSSLAllowsAnyRoot
  796.               * - kCFStreamSSLValidatesCertificateChain
  797.               * - kCFStreamSSLPeerName
  798.               * - kCFStreamSSLCertificates
  799.               * - kCFStreamSSLIsServer

  800.  
  801.            如果你传递空或者空字典,将使用默认的字典
  802.            默认设置将检查以确保由签署可信的第三方证书机构和没有过期的远程连接的证书
  803.            然而,它不会验证证书上的名字,除非你给它一个名字,通过kCFStreamSSLPeerName键去验证
  804.            这对安全的影响是重要的理解
  805.            想象一下你正试图创建一个到MySecureServer.com的安全连接,但因为一个被攻击的DNS服务器,所以你的socket被定向到MaliciousServer.com
  806.            如果你只是使用默认设置,MaliciousServer.com 有一个有效的证书
  807.            默认设置将无法监测到任何问题,因为证书是有效的
  808.           在这个特殊的情况下,要妥善保护你的连接,应设置kCFStreamSSLPeerName性质为MySecureServer.com.
  809.          如果事前你不知道对等的名字的远程主机(例如,你不确认它是domain.com" or "www.domain.com"),那么你可以使用默认设置来验证证书,然后在获得验证的发行后使用X509Certificate类来验证,X509Certificate类的CocoaAsyncSocket开源项目的一部分

  810.  
  811.          -(void)enablePrebuffering
  812.          对于处理readDataToData请求,数据是必须从socket以小增量的方式读取出来的
  813.          性能通过允许AsyncSocket去一次性读大块的数据和存储任何一个小的内部缓冲区溢出的东西来大大提高
  814.          这被称为预缓冲,就好像一些数据在你要求它之前就可能被读取出来
  815.          如果你经常使用readDataToData,使用预缓冲会有更好的性能,尤其是在iphone上
  816.          默认的预缓冲状态是由DEFAULT_PREBUFFERING 定义控制的,强烈建议设置其为yes
  817.          这方法存在一些预缓冲需要一些不可预见的原因被默认禁用的情况,这时,这种方法存在允许当就绪时,可轻松启用预缓冲

  818.  
  819.           -(BOOL)moveToRunLoop:(NSRunLoop *)runLoop;
  820.           当你创建一个AsyncSocket,它被添加到当前线程runloop
  821.           对于手动创建的socket,在线程上你打算使用它,它是最容易简单的创建的线程上的socket
  822.           当一个新的socket被接受,委托方法 onSocket:wantsRunLoopForNewSocket 会被调用 允许你在一个单独的线程上放置socket,这个工作最好结合在同一个线程池设计
  823.           如果,但是,在一个单独的线程上,在之后的时间,你需要移动一个socket,这个方法可以用来完成任务
  824.           此方法必须从 当前运行的 线程/runloop 的socket 调用
  825.           注意:此方法调用后,所有进一步的方法应该从给定的runloop上调用这个对象
  826.           此外,所有委托调用将会发送到给定的runloop

  827.  

  828.  
  829.           - (BOOL)setRunLoopModes:(NSArray *)runLoopModes;
  830.           - (BOOL)addRunLoopMode:(NSString *)runLoopMode;
  831.           - (BOOL)removeRunLoopMode:(NSString *)runLoopMode;
  832.            允许你配置 socket 使用的 运行循环模式
  833.            运行循环模式设置默认是NSRunLoopCommonModes
  834.            如果你想你的socket 在其他模式下继续操作,你可能需要添加模式 NSModalPanelRunLoopMode 或者 NSEventTrackingRunLoopMode ,或者你可能只想使用 NSRunLoopCommonModes
  835.            可接受的socket将自动 继承相同的运行循环模式就像侦听socket
  836.            注意:NSRunLoopCommonModes 定义在10.5,对于之前的版本可使用 kCFRunLoopCommonModes

  837.  
  838.           -(NSArray *)runLoopModes
  839.             返回当前正在运行的循环模式的AsyncSocket实例, run loop modes的默认设置是NSDefaultRunLoopMode

  840.  
  841.           -(NSData *)unreadData;
  842.          一个错误的事件,在 onSocket:willDisconnectWithError: 将会被调用 去读取留在socket上的任何数据

  843.  
  844.           + (NSData *)CRLFData;   // 0x0D0A
  845.   
  846. 各方法的解析
  847.        -(void)onSocket:(AsyncSocket *)sock willDisconnectWithError:(NSError *)err;   
  848.        发生错误,socket关闭,可以在call-back过程调用"unreadData"去取得socket的最后的数据字节,当连接的时候,该委托方法在    onSocket:didAcceptNewSocket: 或者 onSocket:didConnectToHost: 之前调用

  849.  
  850.       -(void)onSocketDidDisconnect:(ASyncSocket *)sock;
  851.       当socket由于或没有错误而断开连接,如果你想要在断开连接后release socket,在此方法工作,而在onSocket:willDisconnectWithError 释放则不安全

  852.  
  853.        -(void)onSocket:(AsyncSocket *)sock didAcceptNewSocket:(AsyncSocket *)newSocket;
  854.         当产生一个socket去处理连接时调用,此方法会返回 线程上的run-loop 的新的socket和其应处理的委托,如果省略,则使用[NSRunLoop cunrrentRunLoop]

  855.  
  856.           -(BOOL)onSocketWillConnect:(AsyncSocket *)sock;

  857.  
  858.        -(void)onSocket:(AsyncSocket *)sock didConnectToHost :(NSString *)host port:(UINt16)port;
  859.           当socket连接正准备读和写的时候调用,host属性是一个IP地址,而不是一个DNS 名称

  860.  
  861.          -(void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long) tag;
  862.          当socket已完成所要求的数据读入内存时调用,如果有错误则不调用

  863.  
  864.          -(void)onSocket:(Asyncsocket *)sock didReadPartialDataOfLength:(NSUInteger)partiaLength tag:(long)tag;
  865.            当一个socket读取数据,但尚未完成读操作的时候调用,如果使用 readToData: or readToLength: 方法 会发生,可以被用来更新进度条等东西

  866.  
  867.             -(void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag;
  868.              当一个socket已完成请求数据的写入时候调用

  869.  
  870.             -(void)onSocket:(AsyncSocket *)sock didWritePartialDataOfLength:(NSUInteger)partialLength tag:(long)tag;
  871.              当一个socket写入一些数据,但还没有完成整个写入时调用,它可以用来更新进度条等东西

  872.  
  873.                -(NSTimeInterval)onSocket:(AsyncSocket *)sock shouldTimeoutReadWithTag:(long)tag elapsed:(NSTimeInterval)exapsed bytesDone:(NSUInteger)length
  874.               使用读操作已超时但还没完成时调用,此方法允许随意延迟超时,如果返回一个正的时间间隔,读取的超时将有一定量的扩展,如果不实现这个方法,或会像往常一样返回一个负的时间间隔,elapsed参数是  原超时的总和,加上先前通过这种方法添加的任何补充, length参数是 读操作到目前为止已读取的字节数, 注意,如果返回正数的话,这个方法可能被一个单独的读取多次调用

  875.  
  876.                -(NSTimeInterval)onSocket:(AsyncSocket *)sock shouldTimeoutWriteWithTag:(long)tag elapsed:(NSTimeInterval)elapsed bytesDone:(NSUInteger)length;
  877.                 如果一个写操作已达到其超时但还没完成时调用,同上

  878.  
  879.                -(void)onSocketDidSecure:(AsyncSocket *)sock;
  880.                在socket成功完成ssl/tls协商时调用,此方法除非你使用提供startTLS方法时候才调用,
  881.     如果ssl/tls是无效的证书,socket将会立即关闭,onSocket:willDisconnectWithError:代理方法竟会与特定的ssl错误代码一起调用

  882.  
  883.                -(BOOL)canSafelySetDelegate
  884.                用来查看在改变它之前,是否带有与当前的委托有悬而未决的业务(读/写)。当然,应在安全连接或接受委托之前改变委托

  885.  
  886.               一旦接收或连接方法之一被调用,AsyncSocket实例会被锁定,其他接收/连接方法在没有先断开socket不会被调用
  887.               如果尝试失败或超时,这些方法要么返回NO 要么调用 onSocket:willDisconnectWithError: 或 onSockedDidDisconnect
  888.               当传入的连接被接受,AsyncSocket调用多个委托方法。这些方法按照时间顺序排列:
  889.                  1.onSocket:didAcceptNewSocket:
  890.                  2.onSocket:wantsRunLoopForNewSocket:
  891.                  3. onSocketWillConnect:
  892.                
  893.               你的服务器的代码将需要保留公认的socket(如果要接受它),最好的地方是要做到这一点可能在onSocket:didAcceptNewSocket:方法    
  894.              在读和写流已经为新接受的socket设置,onSocket:didConnectToHost:port 方法将在适当的运行循环调用
  895.              多线程注意,如果要想通过实施onSocket:wantsRunLoopForNewSocket:,移动另一个新接受的socket去到另一个循环的socket。然后,应该在调用读和写或者startTLS方法前,等待直到onSocket:didConnectToHost:port:方法。否则读和写时间原定于不正确的runloop,混乱可能会随之而来

  896.  

  897.  
  898.              -(BOOL)acceptOnPort:(UInit16)port error:(NSError **)errPtr;
  899.              告诉socket开始听取和接受制定端口上的连接,当一个连接到来的时候,AsyncSocket实例将调用各种委托方法,socket将听取所有可用的接口(wifi,以太网等)

  900.  
  901.              -(BOOL)connectToHost:(NSString *)hostname onPort:(UInt16)port error :(NSError **)errPtr;
  902.              连接给定的主机和端口,主机hostname可以是域名或者是Ip地址

  903.  
  904.              -(BOOL)connectToAddress:(NSData *)remoteAddr error:(NSError *)errPtr;
  905.              连接到一个给定的地址,制定一个sockaddr结构包裹住一个NSData对象,例如,NSData对象从NSNetService的地址方法返回,如果有一个现有的sockaddr结构,可以将它转换到一个NSData对象,像这样:
  906.  struct sockaddr sa  -> NSData *dsa = [NSData dataWithBytes:&remoteAddr length:remoteAddr.sa_len];
  907.  struct sockaddr *sa -> NSData *dsa = [NSData dataWithBytes:remoteAddr length:remoteAddr->sa_len];

  908.  
  909.              -(void)disconnect;
  910.                 立即断开,任何未处理的读或写都将被丢弃
  911.                 如果socket还没有断开,在这个方法返回之前,onSocketDidDisconnect 委托方法将会被立即调用
  912.                  注意推荐释放AsyncSocket实例的方式:
  913.                    [asyncSocket setDelegate:nil];
  914.                    [asyncSocket disconnect];
  915.                    [asyncSocket release];

  916.  
  917.               -(void)disconnectAfterReading;
  918.                  在已经完成了所有悬而未决的读取时 断开,在调用之后,读取和写入方法将无用,socket将断开 即使仍有待写入

  919.  
  920.               - (NSString *)connectedHost;
  921.               - (UInt16)connectedPort;
  922.               - (NSString *)localHost;
  923.               - (UInt16)localPort;
  924.                 返回本地和远程主机和端口给连接的socket,如果没有连接会返回nil或0,主机将会是一个IP地址

  925.  
  926.              -(NSData *)connectedAddress
  927.              -(NSData *)localAddresss
  928.                 返回本地和远程的地址给连接的socket,指定一个socketaddr结构包裹在一个NSData对象

  929.  

  930.  
  931.                 readData和writeData方法不会是block(它们是异步的)
  932.                当读完成 onSocket:didReadData:withTag: 委托方法时调用
  933.                当写完成 onSocket:didWriteDataWithTag: 委托方法时调用
  934.                可以选择任何读/写操作的超时设置(为了不超时,使用负时间间隔。)
  935.                如果读/写操作超时,相应的 onSocket:shouldTimeout...委托方法被调用去选择性地允许我们去延长超时
  936.                超时后,onSocket:willDisconnectWithError: 方法被调用,紧接着是 onSocketDidDisconnect
  937.                tag是为了方便,可以使用它作为数组的索引、步数、state id 、指针等 

  938.  

  939.  

  940.  
  941.             -(void)readDataWithTimeout:(NSTimeInterval)tiemout tag:(long)tag;
  942.               读取socket上第一次成为可用的字节,如果timeout值是负数的,读操作将不使用timeout

  943.  
  944.             - (void)readDataWithTimeout:(NSTimeInterval)timeout buffer:(NSMutableData *)buffer bufferOffset:(NSUInterger)offset tag:(long)tag;
  945.               读取socket上第一次成为可用的字节
  946.               字节将被追加到给定的字节缓冲区,从给定的偏移量开始
  947.               如果需要,给定的缓冲区大小将会自动增加
  948.               如果timeout值是负数的,读操作将不使用timeout
  949.               如果缓冲区为空,socket会为我们创建一个缓冲区
  950.               如果bufferOffset是大于给定的缓冲区的长度,该方法将无用,委托将不会被调用
  951.               如果你传递一个缓冲区,当AsyncSocket在使用它的时候你不能以任何方式改变它
  952.               完成之后,onSocket:didReadData:withTag 返回的数据将是一个给定的缓冲区的子集
  953.               也就是说,它将会被引用到被追加的给定的缓冲区的字节

  954.  
  955.             -(void)readDataToLength:(NSUInterger)length withTimeout:(NSTimeInterval)timeout tag:(long)tag;
  956.             读取给定的字节数,如果length为0,方法将无用,委托将不会被调用

  957.  
  958.             -(void)readDataToLength:(NSUInteger)length withTimeout:(NSTimeInterval)tiemout buffer:(NSMutableData *)buffer bufferOffset:(NSUInteger) offset tag:(long)tag;
  959.             读取给定的字节数,在给定的偏移开始,字节将被追加到给定的字节缓冲区

  960.  
  961.             -(void)readDataToData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag;
  962.             读取字节直到(包括)传入的作为分隔的"data"参数
  963.             如果传递0或者0长度的数据,"data"参数,该方法将无用,委托将不会被调用
  964.             从socket读取一行,使用"data"参数作为行的分隔符 (如HTTP的CRLF)
  965.             注意,此方法不是字符集,因此,如果一个分隔符出现,它自然可以作为进行编码的一部分,读取将提前结束

  966.  
  967.             -(void)readDataToData:(NSData *)data withTimeout:(NSTimeInterval)timeout buffer:(NSMutableData *)buffer bufferOffset:(NSUInteger) offset tag:(long)tag;
  968.            读取字节直到(包括)传入的作为分隔的“data”参数,在给定的偏移量开始,字节将被追加到给定的字节缓冲区。
  969.            从socket读取一行,使用"data"参数作为行的分隔符(如HTTP的CRLF)

  970.  
  971.            -(void)writeData:(NSData *)data withTimeout:(NSTimeInterval) timeout tag:(long)tag;
  972.           将data写入socket,当完成的时候委托被调用 

  973.  
  974.            - (float)progressOfReadReturningTag:(long *)tag bytesDone:(NSUInteger *)done total:(NSUInteger *)total;
  975.            - (float)progressOfWriteReturningTag:(long *)tag bytesDone:(NSUInteger *)done total:(NSUInteger *)total;
  976.            返回当前读或写的进度,从0.0 到 1.0 或者 如果没有读/写的时候返回Nan(使用isNan来检查)
  977.    tag、done、total如果不为空的话,它们将会被填补

  978.  
  979.            

  980.  
  981.            - (void)startTLS:(NSDictionary *)tlsSettings;
  982.            确保使用ssl/tls连接
  983.            这方法可被随时调用,tls握手将会发生在所有悬而未决的读/写完成之后。这紧跟着一个发送依赖 StartTLS消息的协议选项,在排队升级到TLS的同一时间,而不必等待写入完成。在这个方法被调用后,任何读写计划 将会发生在安全链接
  984.            对于可能的keys和TLS设置的值是有据可查的
  985.            一些可能的keys是:
  986.               * - kCFStreamSSLLevel
  987.               * - kCFStreamSSLAllowsExpiredCertificates
  988.               * - kCFStreamSSLAllowsExpiredRoots
  989.               * - kCFStreamSSLAllowsAnyRoot
  990.               * - kCFStreamSSLValidatesCertificateChain
  991.               * - kCFStreamSSLPeerName
  992.               * - kCFStreamSSLCertificates
  993.               * - kCFStreamSSLIsServer

  994.  
  995.            如果你传递空或者空字典,将使用默认的字典
  996.            默认设置将检查以确保由签署可信的第三方证书机构和没有过期的远程连接的证书
  997.            然而,它不会验证证书上的名字,除非你给它一个名字,通过kCFStreamSSLPeerName键去验证
  998.            这对安全的影响是重要的理解
  999.            想象一下你正试图创建一个到MySecureServer.com的安全连接,但因为一个被攻击的DNS服务器,所以你的socket被定向到MaliciousServer.com
  1000.            如果你只是使用默认设置,MaliciousServer.com 有一个有效的证书
  1001.            默认设置将无法监测到任何问题,因为证书是有效的
  1002.           在这个特殊的情况下,要妥善保护你的连接,应设置kCFStreamSSLPeerName性质为MySecureServer.com.
  1003.          如果事前你不知道对等的名字的远程主机(例如,你不确认它是domain.com" or "www.domain.com"),那么你可以使用默认设置来验证证书,然后在获得验证的发行后使用X509Certificate类来验证,X509Certificate类的CocoaAsyncSocket开源项目的一部分

  1004.  
  1005.          -(void)enablePrebuffering
  1006.          对于处理readDataToData请求,数据是必须从socket以小增量的方式读取出来的
  1007.          性能通过允许AsyncSocket去一次性读大块的数据和存储任何一个小的内部缓冲区溢出的东西来大大提高
  1008.          这被称为预缓冲,就好像一些数据在你要求它之前就可能被读取出来
  1009.          如果你经常使用readDataToData,使用预缓冲会有更好的性能,尤其是在iphone上
  1010.          默认的预缓冲状态是由DEFAULT_PREBUFFERING 定义控制的,强烈建议设置其为yes
  1011.          这方法存在一些预缓冲需要一些不可预见的原因被默认禁用的情况,这时,这种方法存在允许当就绪时,可轻松启用预缓冲

  1012.  
  1013.           -(BOOL)moveToRunLoop:(NSRunLoop *)runLoop;
  1014.           当你创建一个AsyncSocket,它被添加到当前线程runloop
  1015.           对于手动创建的socket,在线程上你打算使用它,它是最容易简单的创建的线程上的socket
  1016.           当一个新的socket被接受,委托方法 onSocket:wantsRunLoopForNewSocket 会被调用 允许你在一个单独的线程上放置socket,这个工作最好结合在同一个线程池设计
  1017.           如果,但是,在一个单独的线程上,在之后的时间,你需要移动一个socket,这个方法可以用来完成任务
  1018.           此方法必须从 当前运行的 线程/runloop 的socket 调用
  1019.           注意:此方法调用后,所有进一步的方法应该从给定的runloop上调用这个对象
  1020.           此外,所有委托调用将会发送到给定的runloop

  1021.  

  1022.  
  1023.           - (BOOL)setRunLoopModes:(NSArray *)runLoopModes;
  1024.           - (BOOL)addRunLoopMode:(NSString *)runLoopMode;
  1025.           - (BOOL)removeRunLoopMode:(NSString *)runLoopMode;
  1026.            允许你配置 socket 使用的 运行循环模式
  1027.            运行循环模式设置默认是NSRunLoopCommonModes
  1028.            如果你想你的socket 在其他模式下继续操作,你可能需要添加模式 NSModalPanelRunLoopMode 或者 NSEventTrackingRunLoopMode ,或者你可能只想使用 NSRunLoopCommonModes
  1029.            可接受的socket将自动 继承相同的运行循环模式就像侦听socket
  1030.            注意:NSRunLoopCommonModes 定义在10.5,对于之前的版本可使用 kCFRunLoopCommonModes

  1031.  
  1032.           -(NSArray *)runLoopModes
  1033.             返回当前正在运行的循环模式的AsyncSocket实例, run loop modes的默认设置是NSDefaultRunLoopMode

  1034.  
  1035.           -(NSData *)unreadData;
  1036.          一个错误的事件,在 onSocket:willDisconnectWithError: 将会被调用 去读取留在socket上的任何数据

  1037.  
  1038.           + (NSData *)CRLFData;   // 0x0D0A
  1039.   
  1040. 各方法的解析
  1041.        -(void)onSocket:(AsyncSocket *)sock willDisconnectWithError:(NSError *)err;   
  1042.        发生错误,socket关闭,可以在call-back过程调用"unreadData"去取得socket的最后的数据字节,当连接的时候,该委托方法在    onSocket:didAcceptNewSocket: 或者 onSocket:didConnectToHost: 之前调用
  1043.        发生错误,socket关闭,可以在call-back过程调用"unreadData"去取得socket的最后的数据字节,当连接的时候,该委托方法在    onSocket:didAcceptNewSocket: 或者 onSocket:didConnectToHost: 之前调用
  1044.       -(void)onSocketDidDisconnect:(ASyncSocket *)sock;
  1045.       当socket由于或没有错误而断开连接,如果你想要在断开连接后release socket,在此方法工作,而在onSocket:willDisconnectWithError 释放则不安全
  1046.        -(void)onSocket:(AsyncSocket *)sock didAcceptNewSocket:(AsyncSocket *)newSocket;
  1047.         当产生一个socket去处理连接时调用,此方法会返回 线程上的run-loop 的新的socket和其应处理的委托,如果省略,则使用[NSRunLoop cunrrentRunLoop]
  1048.         当产生一个socket去处理连接时调用,此方法会返回 线程上的run-loop 的新的socket和其应处理的委托,如果省略,则使用[NSRunLoop cunrrentRunLoop]
  1049.           -(BOOL)onSocketWillConnect:(AsyncSocket *)sock;
  1050.        -(void)onSocket:(AsyncSocket *)sock didConnectToHost :(NSString *)host port:(UINt16)port;
  1051.           当socket连接正准备读和写的时候调用,host属性是一个IP地址,而不是一个DNS 名称
  1052.          -(void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long) tag;
  1053.          当socket已完成所要求的数据读入内存时调用,如果有错误则不调用
  1054.          -(void)onSocket:(Asyncsocket *)sock didReadPartialDataOfLength:(NSUInteger)partiaLength tag:(long)tag;
  1055.            当一个socket读取数据,但尚未完成读操作的时候调用,如果使用 readToData: or readToLength: 方法 会发生,可以被用来更新进度条等东西
  1056.             -(void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag;
  1057.              当一个socket已完成请求数据的写入时候调用
  1058.             -(void)onSocket:(AsyncSocket *)sock didWritePartialDataOfLength:(NSUInteger)partialLength tag:(long)tag;
  1059.              当一个socket写入一些数据,但还没有完成整个写入时调用,它可以用来更新进度条等东西
  1060.                -(NSTimeInterval)onSocket:(AsyncSocket *)sock shouldTimeoutReadWithTag:(long)tag elapsed:(NSTimeInterval)exapsed bytesDone:(NSUInteger)length
  1061.               使用读操作已超时但还没完成时调用,此方法允许随意延迟超时,如果返回一个正的时间间隔,读取的超时将有一定量的扩展,如果不实现这个方法,或会像往常一样返回一个负的时间间隔,elapsed参数是  原超时的总和,加上先前通过这种方法添加的任何补充, length参数是 读操作到目前为止已读取的字节数, 注意,如果返回正数的话,这个方法可能被一个单独的读取多次调用
  1062.                -(NSTimeInterval)onSocket:(AsyncSocket *)sock shouldTimeoutWriteWithTag:(long)tag elapsed:(NSTimeInterval)elapsed bytesDone:(NSUInteger)length;
  1063.                 如果一个写操作已达到其超时但还没完成时调用,同上
  1064.                -(void)onSocketDidSecure:(AsyncSocket *)sock;
  1065.                在socket成功完成ssl/tls协商时调用,此方法除非你使用提供startTLS方法时候才调用,
  1066.     如果ssl/tls是无效的证书,socket将会立即关闭,onSocket:willDisconnectWithError:代理方法竟会与特定的ssl错误代码一起调用
  1067.                -(BOOL)canSafelySetDelegate
  1068.                用来查看在改变它之前,是否带有与当前的委托有悬而未决的业务(读/写)。当然,应在安全连接或接受委托之前改变委托
  1069.               一旦接收或连接方法之一被调用,AsyncSocket实例会被锁定,其他接收/连接方法在没有先断开socket不会被调用
  1070.               如果尝试失败或超时,这些方法要么返回NO 要么调用 onSocket:willDisconnectWithError: 或 onSockedDidDisconnect
  1071.               当传入的连接被接受,AsyncSocket调用多个委托方法。这些方法按照时间顺序排列:
  1072.                  1.onSocket:didAcceptNewSocket:
  1073.                  2.onSocket:wantsRunLoopForNewSocket:
  1074.                  3. onSocketWillConnect:
  1075.                
  1076.               你的服务器的代码将需要保留公认的socket(如果要接受它),最好的地方是要做到这一点可能在onSocket:didAcceptNewSocket:方法    
  1077.              在读和写流已经为新接受的socket设置,onSocket:didConnectToHost:port 方法将在适当的运行循环调用
  1078.              多线程注意,如果要想通过实施onSocket:wantsRunLoopForNewSocket:,移动另一个新接受的socket去到另一个循环的socket。然后,应该在调用读和写或者startTLS方法前,等待直到onSocket:didConnectToHost:port:方法。否则读和写时间原定于不正确的runloop,混乱可能会随之而来

  1079.  
  1080.              -(BOOL)acceptOnPort:(UInit16)port error:(NSError **)errPtr;
  1081.              告诉socket开始听取和接受制定端口上的连接,当一个连接到来的时候,AsyncSocket实例将调用各种委托方法,socket将听取所有可用的接口(wifi,以太网等)
  1082.              -(BOOL)connectToHost:(NSString *)hostname onPort:(UInt16)port error :(NSError **)errPtr;
  1083.              连接给定的主机和端口,主机hostname可以是域名或者是Ip地址
  1084.              -(BOOL)connectToAddress:(NSData *)remoteAddr error:(NSError *)errPtr;
  1085.              连接到一个给定的地址,制定一个sockaddr结构包裹住一个NSData对象,例如,NSData对象从NSNetService的地址方法返回,如果有一个现有的sockaddr结构,可以将它转换到一个NSData对象,像这样:
  1086.  struct sockaddr sa  -> NSData *dsa = [NSData dataWithBytes:&remoteAddr length:remoteAddr.sa_len];
  1087.  struct sockaddr *sa -> NSData *dsa = [NSData dataWithBytes:remoteAddr length:remoteAddr->sa_len];
  1088.              -(void)disconnect;
  1089.                 立即断开,任何未处理的读或写都将被丢弃
  1090.                 如果socket还没有断开,在这个方法返回之前,onSocketDidDisconnect 委托方法将会被立即调用
  1091.                  注意推荐释放AsyncSocket实例的方式:
  1092.                    [asyncSocket setDelegate:nil];
  1093.                    [asyncSocket disconnect];
  1094.                    [asyncSocket release];
  1095.               -(void)disconnectAfterReading;
  1096.                  在已经完成了所有悬而未决的读取时 断开,在调用之后,读取和写入方法将无用,socket将断开 即使仍有待写入
  1097.               - (NSString *)connectedHost;
  1098.               - (UInt16)connectedPort;
  1099.               - (NSString *)localHost;
  1100.               - (UInt16)localPort;
  1101.                 返回本地和远程主机和端口给连接的socket,如果没有连接会返回nil或0,主机将会是一个IP地址
  1102.              -(NSData *)connectedAddress
  1103.              -(NSData *)localAddresss
  1104.                 返回本地和远程的地址给连接的socket,指定一个socketaddr结构包裹在一个NSData对象

  1105.  
  1106.                 readData和writeData方法不会是block(它们是异步的)
  1107.                当读完成 onSocket:didReadData:withTag: 委托方法时调用
  1108.                当写完成 onSocket:didWriteDataWithTag: 委托方法时调用
  1109.                可以选择任何读/写操作的超时设置(为了不超时,使用负时间间隔。)
  1110.                如果读/写操作超时,相应的 onSocket:shouldTimeout...委托方法被调用去选择性地允许我们去延长超时
  1111.                超时后,onSocket:willDisconnectWithError: 方法被调用,紧接着是 onSocketDidDisconnect
  1112.                tag是为了方便,可以使用它作为数组的索引、步数、state id 、指针等 

  1113.  

  1114.  
  1115.             -(void)readDataWithTimeout:(NSTimeInterval)tiemout tag:(long)tag;
  1116.               读取socket上第一次成为可用的字节,如果timeout值是负数的,读操作将不使用timeout
  1117.             - (void)readDataWithTimeout:(NSTimeInterval)timeout buffer:(NSMutableData *)buffer bufferOffset:(NSUInterger)offset tag:(long)tag;
  1118.               读取socket上第一次成为可用的字节
  1119.               字节将被追加到给定的字节缓冲区,从给定的偏移量开始
  1120.               如果需要,给定的缓冲区大小将会自动增加
  1121.               如果timeout值是负数的,读操作将不使用timeout
  1122.               如果缓冲区为空,socket会为我们创建一个缓冲区
  1123.               如果bufferOffset是大于给定的缓冲区的长度,该方法将无用,委托将不会被调用
  1124.               如果你传递一个缓冲区,当AsyncSocket在使用它的时候你不能以任何方式改变它
  1125.               完成之后,onSocket:didReadData:withTag 返回的数据将是一个给定的缓冲区的子集
  1126.               也就是说,它将会被引用到被追加的给定的缓冲区的字节
  1127.             -(void)readDataToLength:(NSUInterger)length withTimeout:(NSTimeInterval)timeout tag:(long)tag;
  1128.             读取给定的字节数,如果length为0,方法将无用,委托将不会被调用
  1129.             -(void)readDataToLength:(NSUInteger)length withTimeout:(NSTimeInterval)tiemout buffer:(NSMutableData *)buffer bufferOffset:(NSUInteger) offset tag:(long)tag;
  1130.             读取给定的字节数,在给定的偏移开始,字节将被追加到给定的字节缓冲区
  1131.             -(void)readDataToData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag;
  1132.             读取字节直到(包括)传入的作为分隔的"data"参数
  1133.             如果传递0或者0长度的数据,"data"参数,该方法将无用,委托将不会被调用
  1134.             从socket读取一行,使用"data"参数作为行的分隔符 (如HTTP的CRLF)
  1135.             注意,此方法不是字符集,因此,如果一个分隔符出现,它自然可以作为进行编码的一部分,读取将提前结束
  1136.             -(void)readDataToData:(NSData *)data withTimeout:(NSTimeInterval)timeout buffer:(NSMutableData *)buffer bufferOffset:(NSUInteger) offset tag:(long)tag;
  1137.            读取字节直到(包括)传入的作为分隔的“data”参数,在给定的偏移量开始,字节将被追加到给定的字节缓冲区。
  1138.            从socket读取一行,使用"data"参数作为行的分隔符(如HTTP的CRLF)
  1139.            -(void)writeData:(NSData *)data withTimeout:(NSTimeInterval) timeout tag:(long)tag;
  1140.           将data写入socket,当完成的时候委托被调用 
  1141.            - (float)progressOfReadReturningTag:(long *)tag bytesDone:(NSUInteger *)done total:(NSUInteger *)total;
  1142.            - (float)progressOfWriteReturningTag:(long *)tag bytesDone:(NSUInteger *)done total:(NSUInteger *)total;
  1143.            返回当前读或写的进度,从0.0 到 1.0 或者 如果没有读/写的时候返回Nan(使用isNan来检查)
  1144.    tag、done、total如果不为空的话,它们将会被填补
  1145.            
  1146.            - (void)startTLS:(NSDictionary *)tlsSettings;
  1147.            确保使用ssl/tls连接
  1148.            这方法可被随时调用,tls握手将会发生在所有悬而未决的读/写完成之后。这紧跟着一个发送依赖 StartTLS消息的协议选项,在排队升级到TLS的同一时间,而不必等待写入完成。在这个方法被调用后,任何读写计划 将会发生在安全链接
  1149.            对于可能的keys和TLS设置的值是有据可查的
  1150.            一些可能的keys是:
  1151.               * - kCFStreamSSLLevel
  1152.               * - kCFStreamSSLAllowsExpiredCertificates
  1153.               * - kCFStreamSSLAllowsExpiredRoots
  1154.               * - kCFStreamSSLAllowsAnyRoot
  1155.               * - kCFStreamSSLValidatesCertificateChain
  1156.               * - kCFStreamSSLPeerName
  1157.               * - kCFStreamSSLCertificates
  1158.               * - kCFStreamSSLIsServer
  1159.            如果你传递空或者空字典,将使用默认的字典
  1160.            默认设置将检查以确保由签署可信的第三方证书机构和没有过期的远程连接的证书
  1161.            然而,它不会验证证书上的名字,除非你给它一个名字,通过kCFStreamSSLPeerName键去验证
  1162.            这对安全的影响是重要的理解
  1163.            想象一下你正试图创建一个到MySecureServer.com的安全连接,但因为一个被攻击的DNS服务器,所以你的socket被定向到MaliciousServer.com
  1164.            如果你只是使用默认设置,MaliciousServer.com 有一个有效的证书
  1165.            默认设置将无法监测到任何问题,因为证书是有效的
  1166.           在这个特殊的情况下,要妥善保护你的连接,应设置kCFStreamSSLPeerName性质为MySecureServer.com.
  1167.          如果事前你不知道对等的名字的远程主机(例如,你不确认它是domain.com" or "www.domain.com"),那么你可以使用默认设置来验证证书,然后在获得验证的发行后使用X509Certificate类来验证,X509Certificate类的CocoaAsyncSocket开源项目的一部分
  1168.          -(void)enablePrebuffering
  1169.          对于处理readDataToData请求,数据是必须从socket以小增量的方式读取出来的
  1170.          性能通过允许AsyncSocket去一次性读大块的数据和存储任何一个小的内部缓冲区溢出的东西来大大提高
  1171.          这被称为预缓冲,就好像一些数据在你要求它之前就可能被读取出来
  1172.          如果你经常使用readDataToData,使用预缓冲会有更好的性能,尤其是在iphone上
  1173.          默认的预缓冲状态是由DEFAULT_PREBUFFERING 定义控制的,强烈建议设置其为yes
  1174.          这方法存在一些预缓冲需要一些不可预见的原因被默认禁用的情况,这时,这种方法存在允许当就绪时,可轻松启用预缓冲
  1175.           -(BOOL)moveToRunLoop:(NSRunLoop *)runLoop;
  1176.           当你创建一个AsyncSocket,它被添加到当前线程runloop
  1177.           对于手动创建的socket,在线程上你打算使用它,它是最容易简单的创建的线程上的socket
  1178.           当一个新的socket被接受,委托方法 onSocket:wantsRunLoopForNewSocket 会被调用 允许你在一个单独的线程上放置socket,这个工作最好结合在同一个线程池设计
  1179.           如果,但是,在一个单独的线程上,在之后的时间,你需要移动一个socket,这个方法可以用来完成任务
  1180.           此方法必须从 当前运行的 线程/runloop 的socket 调用
  1181.           注意:此方法调用后,所有进一步的方法应该从给定的runloop上调用这个对象
  1182.           此外,所有委托调用将会发送到给定的runloop

  1183.  
  1184.           - (BOOL)setRunLoopModes:(NSArray *)runLoopModes;
  1185.           - (BOOL)addRunLoopMode:(NSString *)runLoopMode;
  1186.           - (BOOL)removeRunLoopMode:(NSString *)runLoopMode;
  1187.            允许你配置 socket 使用的 运行循环模式
  1188.            运行循环模式设置默认是NSRunLoopCommonModes
  1189.            如果你想你的socket 在其他模式下继续操作,你可能需要添加模式 NSModalPanelRunLoopMode 或者 NSEventTrackingRunLoopMode ,或者你可能只想使用 NSRunLoopCommonModes
  1190.            可接受的socket将自动 继承相同的运行循环模式就像侦听socket
  1191.            注意:NSRunLoopCommonModes 定义在10.5,对于之前的版本可使用 kCFRunLoopCommonModes
  1192.           -(NSArray *)runLoopModes
  1193.             返回当前正在运行的循环模式的AsyncSocket实例, run loop modes的默认设置是NSDefaultRunLoopMode
  1194.           -(NSData *)unreadData;
  1195.          一个错误的事件,在 onSocket:willDisconnectWithError: 将会被调用 去读取留在socket上的任何数据
  1196.           + (NSData *)CRLFData;   // 0x0D0A
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值