第三方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. 加入:AsynSocket.h .m与AsynUdpSocket.h .m四个文件 及CFNetwork.framework
    2. TCP客户端
    3. #import "AsyncSocket.h"
    4. @interface HelloiPhoneViewController : UIViewController {
    5. UITextField    * textField;
    6. AsyncSocket * asyncSocket;
    7. }
    8. @property (retain, nonatomic) IBOutlet UITextField *textField;
    9. - (IBAction) buttonPressed: (id)sender;
    10. - (IBAction) textFieldDoneEditing: (id)sender;
    11. @end
    12. 在需要联接地方使用connectToHost联接服务器
    13. 其中initWithDelegate的参数中self是必须。这个对象指针中的各个Socket响应的函数将被ASyncSocket所调用.initWithDelegate把将当前对象传递进去,这样只要在当前对象方法实现相应方法
    14. asyncSocket = [[AsyncSocket alloc] initWithDelegate:self];
    15. NSError *err = nil;
    16. if(![asyncSocket connectToHost:host on:port error:&err])
    17. {
    18. NSLog(@"Error: %@", err);
    19. }
    20. 关于NSData对象
    21. 无论SOCKET收发都采用NSData对象.它的定义是 http://developer.apple.com/library/mac
      /#documentation/Cocoa/Reference/Foundation/Classes/NSData_Class/Reference/Reference.html
    22. NSData主要是带一个(id)data指向的数据空间和长度 length.
    23. NSString 转换成NSData 对象
    24. NSData* xmlData = [@"testdata" dataUsingEncoding:NSUTF8StringEncoding];
    25. NSData 转换成NSString对象
    26. NSData * data;
    27. NSString *result = [[NSString alloc] initWithData:data         encoding:NSUTF8StringEncoding];
    28. 发送数据
    29. AsyncSocket  writeData    方法来发送数据,它有如下定义
    30. - (void)writeData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag;
    31. 以下是一个实例语句.
    32. NSData* aData= [@"test data" dataUsingEncoding: NSUTF8StringEncoding];
    33. [sock writeData:aData withTimeout:-1 tag:1];
    34. 在onSocket重载函数,有如定义采用是专门用来处理SOCKET的发送数据的:
    35. -(void)onSocket(AsyncSocket *)sock didWriteDataWithTag:(long)tag
    36. {
    37. NSLog(@"thread(%),onSocket:%p didWriteDataWithTag:%d",[[NSThread currentThread] name],
    38. sock,tag);
    39. }
    40. 接收Socket数据.
    41. 在onSocket重载函数,有如定义采用是专门用来处理SOCKET的接收数据的.
    42. -(void) onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
    43. 在中间将其转换成NSString进行显示.
    44. NSString* aStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    45. NSLog(@"===%@",aStr);
    46. [aStr release];
    47. 6、TCP连接读取制定长度的数据
    48. socket连接,可能会读取固定长度的字节
    49. [socket readDataToLength: withTimeout :tag]
    50. 各方法的解析
    51. -(void)onSocket:(AsyncSocket *)sock willDisconnectWithError:(NSError *)err;
    52. 发生错误,socket关闭,可以在call-back过程调用"unreadData"去取得socket的最后的数据字节,当连接的时候,该委托方
      法在    onSocket:didAcceptNewSocket: 或者 onSocket:didConnectToHost: 之前调用
    53. -(void)onSocketDidDisconnect:(ASyncSocket *)sock;
    54. 当socket由于或没有错误而断开连接,如果你想要在断开连接后release socket,在此方法工作,而在onSocket:willDisconnectWithError 释放则不安全
    55. -(void)onSocket:(AsyncSocket *)sock didAcceptNewSocket:(AsyncSocket *)newSocket;
    56. 当产生一个socket去处理连接时调用,此方法会返回 线程上的run-loop 的新的socket和其应处理的委托,如果省略,则使用[NSRunLoop cunrrentRunLoop]
    57. -(BOOL)onSocketWillConnect:(AsyncSocket *)sock;
    58. -(void)onSocket:(AsyncSocket *)sock didConnectToHost :(NSString *)host port:(UINt16)port;
    59. 当socket连接正准备读和写的时候调用,host属性是一个IP地址,而不是一个DNS 名称
    60. -(void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long) tag;
    61. 当socket已完成所要求的数据读入内存时调用,如果有错误则不调用
    62. -(void)onSocket:(Asyncsocket *)sock didReadPartialDataOfLength:(NSUInteger)partiaLength tag:(long)tag;
    63. 当一个socket读取数据,但尚未完成读操作的时候调用,如果使用 readToData: or readToLength: 方法 会发生,可以被用来更新进度条等东西
    64. -(void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag;
    65. 当一个socket已完成请求数据的写入时候调用
    66. -(void)onSocket:(AsyncSocket *)sock didWritePartialDataOfLength:(NSUInteger)partialLength tag:(long)tag;
    67. 当一个socket写入一些数据,但还没有完成整个写入时调用,它可以用来更新进度条等东西
    68. -(NSTimeInterval)onSocket:(AsyncSocket *)sock
      shouldTimeoutReadWithTag:(long)tag elapsed:(NSTimeInterval)exapsed
      bytesDone:(NSUInteger)length
    69. 使用读操作已超时但还没完成时调用,此方法允许随意延迟超时,如果返回一个正的时间间隔,读取的超时将有一定量的扩展,如果不实现这个方法,或会像往常一
      样返回一个负的时间间隔,elapsed参数是  原超时的总和,加上先前通过这种方法添加的任何补充, length参数是
      读操作到目前为止已读取的字节数, 注意,如果返回正数的话,这个方法可能被一个单独的读取多次调用
    70. -(NSTimeInterval)onSocket:(AsyncSocket *)sock
      shouldTimeoutWriteWithTag:(long)tag elapsed:(NSTimeInterval)elapsed
      bytesDone:(NSUInteger)length;
    71. 如果一个写操作已达到其超时但还没完成时调用,同上
    72. -(void)onSocketDidSecure:(AsyncSocket *)sock;
    73. 在socket成功完成ssl/tls协商时调用,此方法除非你使用提供startTLS方法时候才调用,
    74. 如果ssl/tls是无效的证书,socket将会立即关闭,onSocket:willDisconnectWithError:代理方法竟会与特定的ssl错误代码一起调用
    75. -(BOOL)canSafelySetDelegate
    76. 用来查看在改变它之前,是否带有与当前的委托有悬而未决的业务(读/写)。当然,应在安全连接或接受委托之前改变委托
    77. 一旦接收或连接方法之一被调用,AsyncSocket实例会被锁定,其他接收/连接方法在没有先断开socket不会被调用
    78. 如果尝试失败或超时,这些方法要么返回NO 要么调用 onSocket:willDisconnectWithError: 或 onSockedDidDisconnect
    79. 当传入的连接被接受,AsyncSocket调用多个委托方法。这些方法按照时间顺序排列:
    80. 1.onSocket:didAcceptNewSocket:
    81. 2.onSocket:wantsRunLoopForNewSocket:
    82. 3. onSocketWillConnect:
    83. 你的服务器的代码将需要保留公认的socket(如果要接受它),最好的地方是要做到这一点可能在onSocket:didAcceptNewSocket:方法
    84. 在读和写流已经为新接受的socket设置,onSocket:didConnectToHost:port 方法将在适当的运行循环调用
    85. 多线程注意,如果要想通过实施onSocket:wantsRunLoopForNewSocket:,移动另一个新接受的socket去到另一个循环
      的socket。然后,应该在调用读和写或者startTLS方法前,等待直到onSocket:didConnectToHost:port:方法。否
      则读和写时间原定于不正确的runloop,混乱可能会随之而来
    86. -(BOOL)acceptOnPort:(UInit16)port error:(NSError **)errPtr;
    87. 告诉socket开始听取和接受制定端口上的连接,当一个连接到来的时候,AsyncSocket实例将调用各种委托方法,socket将听取所有可用的接口(wifi,以太网等)
    88. -(BOOL)connectToHost:(NSString *)hostname onPort:(UInt16)port error :(NSError **)errPtr;
    89. 连接给定的主机和端口,主机hostname可以是域名或者是Ip地址
    90. -(BOOL)connectToAddress:(NSData *)remoteAddr error:(NSError *)errPtr;
    91. 连接到一个给定的地址,制定一个sockaddr结构包裹住一个NSData对象,例如,NSData对象从NSNetService的地址方法返回,如果有一个现有的sockaddr结构,可以将它转换到一个NSData对象,像这样:
    92. struct sockaddr sa  -> NSData *dsa = [NSData dataWithBytes:&remoteAddr length:remoteAddr.sa_len];
    93. struct sockaddr *sa -> NSData *dsa = [NSData dataWithBytes:remoteAddr length:remoteAddr->sa_len];
    94. -(void)disconnect;
    95. 立即断开,任何未处理的读或写都将被丢弃
    96. 如果socket还没有断开,在这个方法返回之前,onSocketDidDisconnect 委托方法将会被立即调用
    97. 注意推荐释放AsyncSocket实例的方式:
    98. [asyncSocket setDelegate:nil];
    99. [asyncSocket disconnect];
    100. [asyncSocket release];
    101. -(void)disconnectAfterReading;
    102. 在已经完成了所有悬而未决的读取时 断开,在调用之后,读取和写入方法将无用,socket将断开 即使仍有待写入
    103. - (NSString *)connectedHost;
    104. - (UInt16)connectedPort;
    105. - (NSString *)localHost;
    106. - (UInt16)localPort;
    107. 返回本地和远程主机和端口给连接的socket,如果没有连接会返回nil或0,主机将会是一个IP地址
    108. -(NSData *)connectedAddress
    109. -(NSData *)localAddresss
    110. 返回本地和远程的地址给连接的socket,指定一个socketaddr结构包裹在一个NSData对象
    111. readData和writeData方法不会是block(它们是异步的)
    112. 当读完成 onSocket:didReadData:withTag: 委托方法时调用
    113. 当写完成 onSocket:didWriteDataWithTag: 委托方法时调用
    114. 可以选择任何读/写操作的超时设置(为了不超时,使用负时间间隔。)
    115. 如果读/写操作超时,相应的 onSocket:shouldTimeout...委托方法被调用去选择性地允许我们去延长超时
    116. 超时后,onSocket:willDisconnectWithError: 方法被调用,紧接着是 onSocketDidDisconnect
    117. tag是为了方便,可以使用它作为数组的索引、步数、state id 、指针等
    118. -(void)readDataWithTimeout:(NSTimeInterval)tiemout tag:(long)tag;
    119. 读取socket上第一次成为可用的字节,如果timeout值是负数的,读操作将不使用timeout
    120. - (void)readDataWithTimeout:(NSTimeInterval)timeout
      buffer:(NSMutableData *)buffer bufferOffset:(NSUInterger)offset
      tag:(long)tag;
    121. 读取socket上第一次成为可用的字节
    122. 字节将被追加到给定的字节缓冲区,从给定的偏移量开始
    123. 如果需要,给定的缓冲区大小将会自动增加
    124. 如果timeout值是负数的,读操作将不使用timeout
    125. 如果缓冲区为空,socket会为我们创建一个缓冲区
    126. 如果bufferOffset是大于给定的缓冲区的长度,该方法将无用,委托将不会被调用
    127. 如果你传递一个缓冲区,当AsyncSocket在使用它的时候你不能以任何方式改变它
    128. 完成之后,onSocket:didReadData:withTag 返回的数据将是一个给定的缓冲区的子集
    129. 也就是说,它将会被引用到被追加的给定的缓冲区的字节
    130. -(void)readDataToLength:(NSUInterger)length withTimeout:(NSTimeInterval)timeout tag:(long)tag;
    131. 读取给定的字节数,如果length为0,方法将无用,委托将不会被调用
    132. -(void)readDataToLength:(NSUInteger)length
      withTimeout:(NSTimeInterval)tiemout buffer:(NSMutableData *)buffer
      bufferOffset:(NSUInteger) offset tag:(long)tag;
    133. 读取给定的字节数,在给定的偏移开始,字节将被追加到给定的字节缓冲区
    134. -(void)readDataToData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag;
    135. 读取字节直到(包括)传入的作为分隔的"data"参数
    136. 如果传递0或者0长度的数据,"data"参数,该方法将无用,委托将不会被调用
    137. 从socket读取一行,使用"data"参数作为行的分隔符 (如HTTP的CRLF)
    138. 注意,此方法不是字符集,因此,如果一个分隔符出现,它自然可以作为进行编码的一部分,读取将提前结束
    139. -(void)readDataToData:(NSData *)data
      withTimeout:(NSTimeInterval)timeout buffer:(NSMutableData *)buffer
      bufferOffset:(NSUInteger) offset tag:(long)tag;
    140. 读取字节直到(包括)传入的作为分隔的“data”参数,在给定的偏移量开始,字节将被追加到给定的字节缓冲区。
    141. 从socket读取一行,使用"data"参数作为行的分隔符(如HTTP的CRLF)
    142. -(void)writeData:(NSData *)data withTimeout:(NSTimeInterval) timeout tag:(long)tag;
    143. 将data写入socket,当完成的时候委托被调用
    144. - (float)progressOfReadReturningTag:(long *)tag bytesDone:(NSUInteger *)done total:(NSUInteger *)total;
    145. - (float)progressOfWriteReturningTag:(long *)tag bytesDone:(NSUInteger *)done total:(NSUInteger *)total;
    146. 返回当前读或写的进度,从0.0 到 1.0 或者 如果没有读/写的时候返回Nan(使用isNan来检查)
    147. tag、done、total如果不为空的话,它们将会被填补
    148. - (void)startTLS:(NSDictionary *)tlsSettings;
    149. 确保使用ssl/tls连接
    150. 这方法可被随时调用,tls握手将会发生在所有悬而未决的读/写完成之后。这紧跟着一个发送依赖 StartTLS消息的协议选项,在排队升级到TLS的同一时间,而不必等待写入完成。在这个方法被调用后,任何读写计划 将会发生在安全链接
    151. 对于可能的keys和TLS设置的值是有据可查的
    152. 一些可能的keys是:
    153. * - kCFStreamSSLLevel
    154. * - kCFStreamSSLAllowsExpiredCertificates
    155. * - kCFStreamSSLAllowsExpiredRoots
    156. * - kCFStreamSSLAllowsAnyRoot
    157. * - kCFStreamSSLValidatesCertificateChain
    158. * - kCFStreamSSLPeerName
    159. * - kCFStreamSSLCertificates
    160. * - kCFStreamSSLIsServer
    161. 如果你传递空或者空字典,将使用默认的字典
    162. 默认设置将检查以确保由签署可信的第三方证书机构和没有过期的远程连接的证书
    163. 然而,它不会验证证书上的名字,除非你给它一个名字,通过kCFStreamSSLPeerName键去验证
    164. 这对安全的影响是重要的理解
    165. 想象一下你正试图创建一个到MySecureServer.com的安全连接,但因为一个被攻击的DNS服务器,所以你的socket被定向到MaliciousServer.com
    166. 如果你只是使用默认设置,MaliciousServer.com 有一个有效的证书
    167. 默认设置将无法监测到任何问题,因为证书是有效的
    168. 在这个特殊的情况下,要妥善保护你的连接,应设置kCFStreamSSLPeerName性质为MySecureServer.com.
    169. 如果事前你不知道对等的名字的远程主机(例如,你不确认它是domain.com" or
      "www.domain.com"),那么你可以使用默认设置来验证证书,然后在获得验证的发行后使用X509Certificate类来验
      证,X509Certificate类的CocoaAsyncSocket开源项目的一部分
    170. -(void)enablePrebuffering
    171. 对于处理readDataToData请求,数据是必须从socket以小增量的方式读取出来的
    172. 性能通过允许AsyncSocket去一次性读大块的数据和存储任何一个小的内部缓冲区溢出的东西来大大提高
    173. 这被称为预缓冲,就好像一些数据在你要求它之前就可能被读取出来
    174. 如果你经常使用readDataToData,使用预缓冲会有更好的性能,尤其是在iphone上
    175. 默认的预缓冲状态是由DEFAULT_PREBUFFERING 定义控制的,强烈建议设置其为yes
    176. 这方法存在一些预缓冲需要一些不可预见的原因被默认禁用的情况,这时,这种方法存在允许当就绪时,可轻松启用预缓冲
    177. -(BOOL)moveToRunLoop:(NSRunLoop *)runLoop;
    178. 当你创建一个AsyncSocket,它被添加到当前线程runloop
    179. 对于手动创建的socket,在线程上你打算使用它,它是最容易简单的创建的线程上的socket
    180. 当一个新的socket被接受,委托方法 onSocket:wantsRunLoopForNewSocket 会被调用 允许你在一个单独的线程上放置socket,这个工作最好结合在同一个线程池设计
    181. 如果,但是,在一个单独的线程上,在之后的时间,你需要移动一个socket,这个方法可以用来完成任务
    182. 此方法必须从 当前运行的 线程/runloop 的socket 调用
    183. 注意:此方法调用后,所有进一步的方法应该从给定的runloop上调用这个对象
    184. 此外,所有委托调用将会发送到给定的runloop
    185. - (BOOL)setRunLoopModes:(NSArray *)runLoopModes;
    186. - (BOOL)addRunLoopMode:(NSString *)runLoopMode;
    187. - (BOOL)removeRunLoopMode:(NSString *)runLoopMode;
    188. 允许你配置 socket 使用的 运行循环模式
    189. 运行循环模式设置默认是NSRunLoopCommonModes
    190. 如果你想你的socket 在其他模式下继续操作,你可能需要添加模式 NSModalPanelRunLoopMode 或者
      NSEventTrackingRunLoopMode ,或者你可能只想使用 NSRunLoopCommonModes
    191. 可接受的socket将自动 继承相同的运行循环模式就像侦听socket
    192. 注意:NSRunLoopCommonModes 定义在10.5,对于之前的版本可使用 kCFRunLoopCommonModes
    193. -(NSArray *)runLoopModes
    194. 返回当前正在运行的循环模式的AsyncSocket实例, run loop modes的默认设置是NSDefaultRunLoopMode
    195. -(NSData *)unreadData;
    196. 一个错误的事件,在 onSocket:willDisconnectWithError: 将会被调用 去读取留在socket上的任何数据
    197. + (NSData *)CRLFData;   // 0x0D0A
    198. 各方法的解析
    199. -(void)onSocket:(AsyncSocket *)sock willDisconnectWithError:(NSError *)err;
    200. 发生错误,socket关闭,可以在call-back过程调用"unreadData"去取得socket的最后的数据字节,当连接的时候,该委托方
      法在    onSocket:didAcceptNewSocket: 或者 onSocket:didConnectToHost: 之前调用
    201. -(void)onSocketDidDisconnect:(ASyncSocket *)sock;
    202. 当socket由于或没有错误而断开连接,如果你想要在断开连接后release socket,在此方法工作,而在onSocket:willDisconnectWithError 释放则不安全
    203. -(void)onSocket:(AsyncSocket *)sock didAcceptNewSocket:(AsyncSocket *)newSocket;
    204. 当产生一个socket去处理连接时调用,此方法会返回 线程上的run-loop 的新的socket和其应处理的委托,如果省略,则使用[NSRunLoop cunrrentRunLoop]
    205. -(BOOL)onSocketWillConnect:(AsyncSocket *)sock;
    206. -(void)onSocket:(AsyncSocket *)sock didConnectToHost :(NSString *)host port:(UINt16)port;
    207. 当socket连接正准备读和写的时候调用,host属性是一个IP地址,而不是一个DNS 名称
    208. -(void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long) tag;
    209. 当socket已完成所要求的数据读入内存时调用,如果有错误则不调用
    210. -(void)onSocket:(Asyncsocket *)sock didReadPartialDataOfLength:(NSUInteger)partiaLength tag:(long)tag;
    211. 当一个socket读取数据,但尚未完成读操作的时候调用,如果使用 readToData: or readToLength: 方法 会发生,可以被用来更新进度条等东西
    212. -(void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag;
    213. 当一个socket已完成请求数据的写入时候调用
    214. -(void)onSocket:(AsyncSocket *)sock didWritePartialDataOfLength:(NSUInteger)partialLength tag:(long)tag;
    215. 当一个socket写入一些数据,但还没有完成整个写入时调用,它可以用来更新进度条等东西
    216. -(NSTimeInterval)onSocket:(AsyncSocket *)sock
      shouldTimeoutReadWithTag:(long)tag elapsed:(NSTimeInterval)exapsed
      bytesDone:(NSUInteger)length
    217. 使用读操作已超时但还没完成时调用,此方法允许随意延迟超时,如果返回一个正的时间间隔,读取的超时将有一定量的扩展,如果不实现这个方法,或会像往常一
      样返回一个负的时间间隔,elapsed参数是  原超时的总和,加上先前通过这种方法添加的任何补充, length参数是
      读操作到目前为止已读取的字节数, 注意,如果返回正数的话,这个方法可能被一个单独的读取多次调用
    218. -(NSTimeInterval)onSocket:(AsyncSocket *)sock
      shouldTimeoutWriteWithTag:(long)tag elapsed:(NSTimeInterval)elapsed
      bytesDone:(NSUInteger)length;
    219. 如果一个写操作已达到其超时但还没完成时调用,同上
    220. -(void)onSocketDidSecure:(AsyncSocket *)sock;
    221. 在socket成功完成ssl/tls协商时调用,此方法除非你使用提供startTLS方法时候才调用,
    222. 如果ssl/tls是无效的证书,socket将会立即关闭,onSocket:willDisconnectWithError:代理方法竟会与特定的ssl错误代码一起调用
    223. -(BOOL)canSafelySetDelegate
    224. 用来查看在改变它之前,是否带有与当前的委托有悬而未决的业务(读/写)。当然,应在安全连接或接受委托之前改变委托
    225. 一旦接收或连接方法之一被调用,AsyncSocket实例会被锁定,其他接收/连接方法在没有先断开socket不会被调用
    226. 如果尝试失败或超时,这些方法要么返回NO 要么调用 onSocket:willDisconnectWithError: 或 onSockedDidDisconnect
    227. 当传入的连接被接受,AsyncSocket调用多个委托方法。这些方法按照时间顺序排列:
    228. 1.onSocket:didAcceptNewSocket:
    229. 2.onSocket:wantsRunLoopForNewSocket:
    230. 3. onSocketWillConnect:
    231. 你的服务器的代码将需要保留公认的socket(如果要接受它),最好的地方是要做到这一点可能在onSocket:didAcceptNewSocket:方法
    232. 在读和写流已经为新接受的socket设置,onSocket:didConnectToHost:port 方法将在适当的运行循环调用
    233. 多线程注意,如果要想通过实施onSocket:wantsRunLoopForNewSocket:,移动另一个新接受的socket去到另一个循环
      的socket。然后,应该在调用读和写或者startTLS方法前,等待直到onSocket:didConnectToHost:port:方法。否
      则读和写时间原定于不正确的runloop,混乱可能会随之而来
    234. -(BOOL)acceptOnPort:(UInit16)port error:(NSError **)errPtr;
    235. 告诉socket开始听取和接受制定端口上的连接,当一个连接到来的时候,AsyncSocket实例将调用各种委托方法,socket将听取所有可用的接口(wifi,以太网等)
    236. -(BOOL)connectToHost:(NSString *)hostname onPort:(UInt16)port error :(NSError **)errPtr;
    237. 连接给定的主机和端口,主机hostname可以是域名或者是Ip地址
    238. -(BOOL)connectToAddress:(NSData *)remoteAddr error:(NSError *)errPtr;
    239. 连接到一个给定的地址,制定一个sockaddr结构包裹住一个NSData对象,例如,NSData对象从NSNetService的地址方法返回,如果有一个现有的sockaddr结构,可以将它转换到一个NSData对象,像这样:
    240. struct sockaddr sa  -> NSData *dsa = [NSData dataWithBytes:&remoteAddr length:remoteAddr.sa_len];
    241. struct sockaddr *sa -> NSData *dsa = [NSData dataWithBytes:remoteAddr length:remoteAddr->sa_len];
    242. -(void)disconnect;
    243. 立即断开,任何未处理的读或写都将被丢弃
    244. 如果socket还没有断开,在这个方法返回之前,onSocketDidDisconnect 委托方法将会被立即调用
    245. 注意推荐释放AsyncSocket实例的方式:
    246. [asyncSocket setDelegate:nil];
    247. [asyncSocket disconnect];
    248. [asyncSocket release];
    249. -(void)disconnectAfterReading;
    250. 在已经完成了所有悬而未决的读取时 断开,在调用之后,读取和写入方法将无用,socket将断开 即使仍有待写入
    251. - (NSString *)connectedHost;
    252. - (UInt16)connectedPort;
    253. - (NSString *)localHost;
    254. - (UInt16)localPort;
    255. 返回本地和远程主机和端口给连接的socket,如果没有连接会返回nil或0,主机将会是一个IP地址
    256. -(NSData *)connectedAddress
    257. -(NSData *)localAddresss
    258. 返回本地和远程的地址给连接的socket,指定一个socketaddr结构包裹在一个NSData对象
    259. readData和writeData方法不会是block(它们是异步的)
    260. 当读完成 onSocket:didReadData:withTag: 委托方法时调用
    261. 当写完成 onSocket:didWriteDataWithTag: 委托方法时调用
    262. 可以选择任何读/写操作的超时设置(为了不超时,使用负时间间隔。)
    263. 如果读/写操作超时,相应的 onSocket:shouldTimeout...委托方法被调用去选择性地允许我们去延长超时
    264. 超时后,onSocket:willDisconnectWithError: 方法被调用,紧接着是 onSocketDidDisconnect
    265. tag是为了方便,可以使用它作为数组的索引、步数、state id 、指针等
    266. -(void)readDataWithTimeout:(NSTimeInterval)tiemout tag:(long)tag;
    267. 读取socket上第一次成为可用的字节,如果timeout值是负数的,读操作将不使用timeout
    268. - (void)readDataWithTimeout:(NSTimeInterval)timeout
      buffer:(NSMutableData *)buffer bufferOffset:(NSUInterger)offset
      tag:(long)tag;
    269. 读取socket上第一次成为可用的字节
    270. 字节将被追加到给定的字节缓冲区,从给定的偏移量开始
    271. 如果需要,给定的缓冲区大小将会自动增加
    272. 如果timeout值是负数的,读操作将不使用timeout
    273. 如果缓冲区为空,socket会为我们创建一个缓冲区
    274. 如果bufferOffset是大于给定的缓冲区的长度,该方法将无用,委托将不会被调用
    275. 如果你传递一个缓冲区,当AsyncSocket在使用它的时候你不能以任何方式改变它
    276. 完成之后,onSocket:didReadData:withTag 返回的数据将是一个给定的缓冲区的子集
    277. 也就是说,它将会被引用到被追加的给定的缓冲区的字节
    278. -(void)readDataToLength:(NSUInterger)length withTimeout:(NSTimeInterval)timeout tag:(long)tag;
    279. 读取给定的字节数,如果length为0,方法将无用,委托将不会被调用
    280. -(void)readDataToLength:(NSUInteger)length
      withTimeout:(NSTimeInterval)tiemout buffer:(NSMutableData *)buffer
      bufferOffset:(NSUInteger) offset tag:(long)tag;
    281. 读取给定的字节数,在给定的偏移开始,字节将被追加到给定的字节缓冲区
    282. -(void)readDataToData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag;
    283. 读取字节直到(包括)传入的作为分隔的"data"参数
    284. 如果传递0或者0长度的数据,"data"参数,该方法将无用,委托将不会被调用
    285. 从socket读取一行,使用"data"参数作为行的分隔符 (如HTTP的CRLF)
    286. 注意,此方法不是字符集,因此,如果一个分隔符出现,它自然可以作为进行编码的一部分,读取将提前结束
    287. -(void)readDataToData:(NSData *)data
      withTimeout:(NSTimeInterval)timeout buffer:(NSMutableData *)buffer
      bufferOffset:(NSUInteger) offset tag:(long)tag;
    288. 读取字节直到(包括)传入的作为分隔的“data”参数,在给定的偏移量开始,字节将被追加到给定的字节缓冲区。
    289. 从socket读取一行,使用"data"参数作为行的分隔符(如HTTP的CRLF)
    290. -(void)writeData:(NSData *)data withTimeout:(NSTimeInterval) timeout tag:(long)tag;
    291. 将data写入socket,当完成的时候委托被调用
    292. - (float)progressOfReadReturningTag:(long *)tag bytesDone:(NSUInteger *)done total:(NSUInteger *)total;
    293. - (float)progressOfWriteReturningTag:(long *)tag bytesDone:(NSUInteger *)done total:(NSUInteger *)total;
    294. 返回当前读或写的进度,从0.0 到 1.0 或者 如果没有读/写的时候返回Nan(使用isNan来检查)
    295. tag、done、total如果不为空的话,它们将会被填补
时间: 2024-10-28 21:31:58

第三方Asyncsocket使用的相关文章

01-socket第三方库 AsyncSocket(GCDAsyncSocket)

[IOS网络通信]socket第三方库 AsyncSocket(GCDAsyncSocket) Socket描述了一个IP.端口对.它简化了程序员的操作,知道对方的IP以及PORT就可以给对方发送消息,再由服务器端来处理发送的这些消息.所以,Socket一定包含了通信的双发,即客户端(Client)与服务端(server). 1)服务端利用Socket监听端口: 2)客户端发起连接: 3)服务端返回信息,建立连接,开始通信: 4)客户端,服务端断开连接. 1套接字(socket)概念 套接字(s

Socket第三方库AsyncSocket实现简单的点对点通信聊天

首先声明,我是个菜鸟,之所以写点随笔,是因为自己在开发的过程中遇到过这方面的难题,第一次接触,完全一片空白,因为之前请求数据的时候一直用的是http协议,所以没用过TCP,后来 查了很多资料,才慢慢理清了头绪,发现其实也不是很难,就是里面的几个方法.我只是初步了解,写这个也是希望能够让自己对此加深印象,也是在见证着自己慢慢进步吧.所以有不喜欢的大神勿喷哈,谢谢. 一般的做即时通讯,都会用到第三方,比如说融云,环信啊什么的,但是我们的项目需求就是不让用第三方,没办法,所以只能自己写了.也正是因此,

iOS Socket第三方开源类库 ----AsyncSocket

假如你也是一个java程序员,而你又不是很懂Socket. 下面我的这篇文章也许能帮助你一些. http://xiva.iteye.com/blog/993336 首先我们写好上面文章中的server端. 下面我们可以访问一下下面的地址: http://code.google.com/p/cocoaasyncsocket/ 这是一个开源框架.呵,不知道拿到自己程序中使用是否涉及侵权. 但是这句话“The CocoaAsyncSocket project is in the public doma

IOS开发第三方开源库

IOSios开发第三方开源库 1. AFNetworking 在众多iOS开源项目中,AFNetworking可以称得上是最受开发者欢迎的库项目.AFNetworking是一个轻量级的iOS.Mac OS X网络通信类库,现在是GitHub上第三大Objective-C库.它建立在NSURLConnection.NSOperation等类库的基础上,让很多网络通信功能的实现变得十分简单,因此,许多iOS应用开发都会使用到它. 支持HTTP请求和基于REST的网络服务(包括GET.POST.PUT

最全面的iOS和Mac开源项目和第三方库汇总

UI 下拉刷新 EGOTableViewPullRefresh – 最早的下拉刷新控件. SVPullToRefresh – 下拉刷新控件. MJRefresh – 仅需一行代码就可以为UITableView或者CollectionView加上下拉刷新或者上拉刷新功能.可以自定义上下拉刷新的文字说明.具体使用看“使用方法”. (国人写) XHRefreshControl – XHRefreshControl 是一款高扩展性.低耦合度的下拉刷新.上提加载更多的组件.(国人写) CBStoreHou

IOS第三方框架集合

在iOS开发中不可避免的会用到一些第三方类库,它们提供了很多实用的功能,使我们的开发变得更有效率:同时,也可以从它们的源代码中学习到很多有用的东西. Reachability 检测网络连接 用来检查网络连接是否可用:包括WIFI和WWAN(3G/EDGE/CDMA等)两种工作模式. 现在有更好的替代品:https://github.com/tonymillion/Reachability,比Apple提供的兼容性更好,而且更加好用,更具体的使用方法请看它提供的例子. 1 Reachability

IOS socket编程--Asyncsocket

iPhone的标准推荐是CFNetwork 库编程,其封装好的开源库是 cocoa AsyncSocket库,用它来简化CFNetwork的调用,它提供了异步操作 主要特性有: 队列的非阻塞的读和写,而且可选超时.你可以调用它读取和写入,它会当完成后告知你 自动的socket接收.如果你调用它接收连接,它将为每个连接启动新的实例,当然,也可以立即关闭这些连接 委托(delegate)支持.错误.连接.接收.完整的读取.完整的写入.进度以及断开连接,都可以通过委托模式调用 基于run loop的,

使用OC runtime解决第三方库冲突

前几天在iOS app项目中添加了几个第三方库,各有各的用处,因为一些原因,有些库是不开源的. 添加后,发现app编译不通过,错误如下: 从错误描述中都能看出,app在连接过程中,发现了一些重复的符号,即同样的OC类和方法在不同的库中都有实现:liblibPDRCore.a和libsimpleconfiglib.a这两个库有冲突!恰好,这两个库都要用,而且都不开源,仿佛一下子就走进了死胡同,因为没有办法修改这两个库. 网上搜了一下,碰到这种问题的人还真不少,也提出了解决方案:用lipo命令分解其

iOS学习之Socket使用简明教程- AsyncSocket

如果需要在项目中像QQ微信一样做到即时通讯,必须使用socket通讯,本人也是刚学习,分享一下,有什么不对的地方希望大家指正 ios原生的socket用起来不是很直观,所以我用的是AsyncSocket这个第三方库,对socket的封装比较好,只是好像没有带外传输(out-of-band) 如果你的服务器需要发送带外数据,可能得想下别的办法 环境 下载AsyncSockethttps://github.com/robbiehanson/CocoaAsyncSocket类库,将RunLoop文件夹