天天看點

iOS網絡程式設計實踐--NSStream實作TCP Socket iPhone用戶端

用戶端我們使用iphone應用程式,畫面比較簡單。點選發送按鈕,給伺服器發送一些字元串過去。點選接收按鈕就會從伺服器讀取一些字元串,并且顯示在畫面上。

iOS網絡程式設計實踐--NSStream實作TCP Socket iPhone用戶端

有關用戶端應用的ui部分不再介紹了,我們直接看代碼部分,socket用戶端可以采用cfstream或nsstream實作。為了給讀者介紹更多的知識,本例我們采用nsstream實作。nsstream實作采用objective-c語言,一些面向對象的類。

下面我們看看用戶端視圖控制器viewcontroller.h

定義屬性inputstream和outputstream,它們輸入流nsinputstream和輸出流nsoutputstream類。它們與伺服器cfstream實作中的輸入流cfreadstreamref和輸出流cfwritestreamref對應的。

視圖控制器viewcontroller.m的初始化網絡方法initnetworkcommunication代碼:

它們都調用initnetworkcommunication方法,并設定操作辨別flag,如果flag為0發送資料,flag為1接收資料。

流的狀态的變化觸發很多事件,并回調nsstreamdelegate協定中定義的方法stream:handleevent:,其代碼如下:

在讀取資料分支(nsstreameventhasbytesavailable)中,代碼第①行為讀取資料準備緩沖區,本例中設定的是1024個位元組,這個大小會對流的讀取有很多的影響。第②行代碼使用hasbytesavailable方法判斷是否流有資料可以讀,如果有可讀資料就進行循環讀取。第③行代碼使用流的read:maxlength:方法讀取資料到緩沖區,第1個參數是緩沖區對象buffer,第2個參數是讀取的緩沖區的位元組長度。

在寫入資料分支(nsstreameventhasspaceavailable)中,代碼第④行是要寫入的資料,第⑤行代碼[_outputstream write:buff maxlength: strlen((const char*)buff)+1]是寫如資料方法。

第⑥和第⑦行代碼[self close]調用close方法關閉,close方法代碼如下: