ios開發 網路編程淺析(二)

來源:互聯網
上載者:User

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的回呼函數類似,回呼函數可以得到事件類型和相關的資料。

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.