• ios开发 网络编程浅析(二)


    CFStream  

         读写流以设备依赖的方式为交换数据提供了一个简单的途径。可以为内存中的数据、文件中的数据或网络上的数据(使用套接字)创建流,而不用把全部数据一次性读到内存中去。套接字流为通过套接字读写数据提供了一个简单易用的接口。每个套接字都可以与输入流和输出流绑定,允许异步的通信。CFStream包装了大部分读写字节流需要的工作,替换了C语言中传统的send和recv方法。CFSream对象包括两种类型:CFReadStream和CFWriteStream。

    1.CFReadStream

       它提供了一系列从套接字读取数据相关的方法,下面列出其中一些常用的函数。

    (1)CFReadStreamOpen和CFReadStreamClose  打开和关闭一个读取流(read stream),分配或释放相关资源。读取流打开后,才能从中读取数据。

    (2)CFReadStreamRead  从流中读取数据的函数,返回实际读取的字节数。这个方法会阻塞直到接收到数据。

    (3)CFReadStreamGetBufer  返回指向读取流内部未读数据缓存区的指针。

    (4)CFReadStreamGetStatus  返回读取流的当前状态。 

    读取流的当前状态 
    •  kCFStreamStatusNotOpen(读取流没有被打开)
    • kCFStreamStatusOpening(读取流正在被打开)
    • kCFStreamStatusOpen(读取流已经被打开)
    • kCFStreamReading(正在对流执行读取操作)
    • kCFSreamStatusAtEnd(读取流中没有可以读取的数据)
    • kCFStreamStatusClosed(读取流已经被关闭)
    • kCFStreamStatusError(读取流的时候发生了错误)
    (5)CFReadStreamHasBytesAvailable。

    返回一个布尔值,表示是否存在数据可以不阻塞地读取。如果不通过实际读取操作函数无法确定是否存在数据,则返回TRUE。

    (6) CFReadStreamSheduleWithRunLoop和CFReadStreamUnscheduleFromRunLoop。

    通过调用CFReadStreamSheduleWithRunLoop,指定run loop和run loop模式,使用CFReadStreamSetClient方法设置的回调函数在事件发生时会被调用。比如,在流被打开、有数据可以读取等事件发生时调用回调函数。使用 CFReadStreamUnscheduleFromRunLoop函数从run loop中移除。

    (7)CFReadStreamSetClient。

     设置回调函数在一些事件发生时被调用。回调函数的声明类似于如下所示。

      void CallBackTest(

    CFReadStreamRef stream,

    CFStreamEventType eventType,

    void *clientCallBackInfo 

      ) 

     与CFSocket的回调函数类似,回调函数可以得到事件类型和相关的数据。事件类型的定义如下。

       typedef enum

      {

    kCFStreamEventNone = 0,(没有事件发生)

    kCFStreamEventOpenCompleted = 1,(流被成功打开)

    kCFStreamEventHasBytesAvailable = 2,(有数据可以读取)

    kCFStreamEventCanAcceptBytes = 4,(流可以接受写入数据(用于写入流))

    kCFStreamEventErrorOccurred = 8(在流上有错误发生)

    kCFStreamEventEndEncountered = 16 (到达了流的结束位置)

      } CFStreamEventType;

     2.CFWriteStream

     CFWriteStream和CFReadStream相对应,它提供了向套接字流写入数据(发送数据)的方法。下面列出一些常用的函数。

    (1)CFWriteStreamOpen和CFWriteStreamClose

    打开和关闭一个写入流(write stream),分配或释放相关资源。写入流打开后,才能向其中写入数据。

    (2)CFWriteStreamWrite

    向流中写入数据的函数,返回实际发送的字节数。这个方法会阻塞,直到数据被发送完。 

    (3)CFWriteStreamStatus

    返回写入流的当前状态,为以下几种。

    • kCFStreamStatusNotOpen(写入流没有被打开)
    • kCFStreamStatusOpening(写入流正在被打开)
    • kCFStreamStatusOpen(写入流已经被打开)
    • kCFStreamWriting(正在对流执行写入操作)
    • kCFStreamStatusAtEnd(没有数据可以向流中写入)
    • kCFStreamStatusClosed(写入流已经被关闭)
    • kCFStreamStatusError (写入流的时候发生了错误)

    (4)CFWriteStreamCanAcceptBytes

    返回一个布尔值,表示是否可以不阻塞地向流中写入数据。如果不通过实际写入操作函数无法确定是否可以写入,则返回TRUE。 

    (5)CFWriteStreamSheduleWithRunloop 和 CFWriteStreamUnscheduleFromRunLoop

    通过调用 CFWriteStreamSheduleWithRunloop ,指定run loop和run loop模式,使用CFWriteStreamSetClient方法设置的回调函数在事件发生时会被调用。比如,在流被打开、可以发送数据事件发生时调用回调函数。使用CFWriteStreamUnscheduleFromRunLoop函数从run loop中移出。

    (6)CFWriteStreamSetClient

     设置回调函数在一些事件发生时被调用。回调函数的声明类似于如下所示。

      void CallBackTest (

      CFWriteStreamRef stream,

    CFStreamEventType eventType,

    void *clientCallBackInfo 

      ) ;

     与CFSocket的回调函数类似,回调函数可以得到事件类型和相关的数据。

  • 相关阅读:
    四天玩转 Windows Phone 开发教学视频
    DZNT REST API doc
    【译著】Code First :使用Entity. Framework编程(1)
    如何关闭ReSharper中的[ Use 'var' ]提示How to Disable C# “var” Recommendation in ReSharper
    查看域名txt记录
    VS文本编辑器vssettings下载站
    .net 开发windows服务
    .net 简单图表控件 (之总结篇 源代码及测试示例) [c/s桌面应用程序控件] IV
    c# 算节气
    js 自定义title提示框
  • 原文地址:https://www.cnblogs.com/hanjun/p/2775194.html
Copyright © 2020-2023  润新知