iOS網絡編程實踐--NSStream實現TCP Socket iPhone客戶端

客戶端我們使用iPhone應用程序,畫面比較簡單。點擊發送按鈕,給服務器發送一些字符串過去。點擊接收按鈕就會從服務器讀取一些字符串,并且顯示在畫面上。

?

?

有關客戶端應用的UI部分不再介紹了,我們直接看代碼部分,Socket客戶端可以采用CFStream或NSStream實現,CFStream 實現方式與服務器端基本一樣。為了給讀者介紹更多的知識,本例我們采用NSStream實現。NSStream實現采用Objective-C語言,一些 面向對象的類。

下面我們看看客戶端視圖控制器ViewController.h

#import <CoreFoundation/CoreFoundation.h>#include <sys/socket.h>#include <netinet/in.h>#define PORT 9000@interface ViewController : UIViewController<NSStreamDelegate>{int flag ; //操作標志 0為發送 1為接收}@property (nonatomic, retain) NSInputStream *inputStream;@property (nonatomic, retain) NSOutputStream *outputStream;@property (weak, nonatomic) IBOutlet UILabel *message;- (IBAction)sendData:(id)sender;- (IBAction)receiveData:(id)sender;@end

?

定義屬性inputStream和outputStream,它們輸入流NSInputStream和輸出流NSOutputStream類。它們與服務器CFStream實現中的輸入流CFReadStreamRef和輸出流CFWriteStreamRef對應的。

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

- (void)initNetworkCommunication{CFReadStreamRef readStream;CFWriteStreamRef writeStream;CFStreamCreatePairWithSocketToHost(NULL,(CFStringRef)@”192.168.1.103″, PORT, &readStream, &writeStream);   ①_inputStream = (__bridge_transfer NSInputStream *)readStream; ②_outputStream = (__bridge_transfer NSOutputStream*)writeStream;  ③[_inputStream setDelegate:self];  ④[_outputStream setDelegate:self];  ⑤[_inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop]forMode:NSDefaultRunLoopMode]; ⑥[_outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop]forMode:NSDefaultRunLoopMode];  ⑦[_inputStream open];  ⑧[_outputStream open];  ⑨}

?

?

點擊發送和接收按鈕觸發的方法如下:

/* 點擊發送按鈕  */- (IBAction)sendData:(id)sender {flag = 0;[self initNetworkCommunication];}/* 點擊接收按鈕  */- (IBAction)receiveData:(id)sender {flag = 1;[self initNetworkCommunication];}

?

它們都調用initNetworkCommunication方法,并設置操作標識flag,如果flag為0發送數據,flag為1接收數據。

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

-(void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent {NSString *event;switch (streamEvent) {case NSStreamEventNone:event = @”NSStreamEventNone”;break;case NSStreamEventOpenCompleted:event = @”NSStreamEventOpenCompleted”;break;case NSStreamEventHasBytesAvailable:event = @”NSStreamEventHasBytesAvailable”;if (flag ==1 && theStream == _inputStream) {NSMutableData *input = [[NSMutableData alloc] init];uint8_t buffer[1024];  ①int len;while([_inputStream hasBytesAvailable]) ②{len = [_inputStream read:buffer maxLength:sizeof(buffer)];  ③if (len > 0){[input appendBytes:buffer length:len];}}NSString *resultstring = [[NSString alloc]initWithData:input encoding:NSUTF8StringEncoding];NSLog(@”接收:%@”,resultstring);_message.text = resultstring;}break;case NSStreamEventHasSpaceAvailable:event = @”NSStreamEventHasSpaceAvailable”;if (flag ==0 && theStream == _outputStream) {//輸出UInt8 buff[] = ”Hello Server!”; ④[_outputStream write:buff maxLength: strlen((const char*)buff)+1]; ⑤//關閉輸出流[_outputStream close];}break;case NSStreamEventErrorOccurred:event = @”NSStreamEventErrorOccurred”;[self close]; ⑥break;case NSStreamEventEndEncountered:event = @”NSStreamEventEndEncountered”;NSLog(@”Error:%d:%@”,[[theStream streamError] code],[[theStream streamError] localizedDescription]);break;default:[self close];  ⑦event = @”Unknown”;break;}NSLog(@”event??%@”,event);}

?

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

在寫入數據分支(NSStreamEventHasSpaceAvailable)中,代碼第④行是要寫入的數據,第⑤行代碼 [_outputStream?write:buff?maxLength:?strlen((const?char*)buff)+1]是寫如數據方 法。

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

-(void)close{[_outputStream close];[_outputStream removeFromRunLoop:[NSRunLoop currentRunLoop]forMode:NSDefaultRunLoopMode];[_outputStream setDelegate:nil];[_inputStream close];[_inputStream removeFromRunLoop:[NSRunLoop currentRunLoop]forMode:NSDefaultRunLoopMode];[_inputStream setDelegate:nil];}

?

轉載于:https://www.cnblogs.com/wwm881101/p/5808944.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/457345.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/457345.shtml
英文地址,請注明出處:http://en.pswp.cn/news/457345.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Mocha 和 Chai 入門初探

轉載自樓主個人博客 Mocha 和 Chai 入門初探Chai 在和 jest 作比較的時候, 兩者主要的不同就是 jest 的集成度比較高內置斷言庫, 而 mocha 需要搭配額外的斷言庫, 在此選擇了比較流行的 chai 作為斷言庫. 風格的選擇 其中 chai 又有好幾種斷言風格, 我們經常見到的其實就是 BDD…

ios把數據傳遞到另一個頁面_IOS 應用之間的跳轉和數據傳遞詳解

說明&#xff1a;本文介紹app如何打開另一個app,并且傳遞數據。一、簡單說明新建兩個應用&#xff0c;分別為應用A和應用B.實現要求:在appA的頁面中點擊對應的按鈕&#xff0c;能夠打開appB這個應用。1.新建兩個應用&#xff0c;分別為A和B.142354418874108[1].png150002248248…

Libevent初探

Libevent 是一個用C語言編寫的、輕量級的開源高性能網絡庫&#xff0c;主要有以下幾個亮點&#xff1a;事件驅動&#xff08; event-driven&#xff09;&#xff0c;高性能;輕量級&#xff0c;專注于網絡&#xff0c;不如 ACE 那么臃腫龐大&#xff1b;源代碼相當精煉、易讀&am…

ServerSocketChannel API用法

java.nio.channels 類 ServerSocketChannel java.lang.Objectjava.nio.channels.spi.AbstractInterruptibleChanneljava.nio.channels.SelectableChanneljava.nio.channels.spi.AbstractSelectableChanneljava.nio.channels.ServerSocketChannel所有已實現的接口&#xff1a; C…

jq分頁 不刷新頁面_jQuery無刷新分頁完整實例代碼

本文實例講述了jQuery無刷新分頁實現方法。分享給大家供大家參考&#xff0c;具體如下&#xff1a;這款jQuery分頁示例&#xff0c;是分頁經典形式&#xff0c;兼容性也做的好&#xff0c;網頁上的分頁代碼&#xff0c;分享給大家。運行效果截圖如下&#xff1a;在線演示地址如…

為什么要寫年終總結

2016只剩下不到百分之一的時間了&#xff0c;網上陸續看到各種企業或個人的總結或盤點&#xff0c;公司也必須規定每個員工要做年度工作總結&#xff0c;或許是環境釋然&#xff0c;心里也有無數次要做總結的念頭&#xff0c;尤其是月末年末這種感覺更重&#xff0c;但卻沒靜下…

特別慢_背什么都特別慢,該怎么提高記憶力?

考研是一項全方位的比拼&#xff0c;除了每天進行知識點的復習&#xff0c;還要做題、總結&#xff0c;最后還得進行背誦記憶&#xff0c;其實什么科目都需要背的&#xff0c;就算數學&#xff0c;該記的概念和公式也是要記憶的&#xff0c;因為會做題更快&#xff0c;提高效率…

tiny4412u-boot燒寫及根文件系統制作(不進入終端問題)

http://m.blog.csdn.net/article/details?id51400196&#xff08;轉&#xff09; VMware12 環境&#xff1a;ubuntu12.4 開發板&#xff1a;tiny4412 首先燒寫bootloader&#xff0c;我用一個8G的內存卡&#xff0c;現在不說sd卡的制作過程了&#xff0c;網上可以參考。 現在就…

第三章 中間件,3.1 萬億級數據洪峰下的分布式消息引擎(作者:馮嘉、誓嘉、塵央、牟羽)...

3.1 萬億級數據洪峰下的分布式消息引擎 前言 通過簡單回顧阿里中間件(Aliware)消息引擎的發展史&#xff0c;本文開篇于雙11消息引擎面臨的低延遲挑戰&#xff0c;通過經典的應用場景闡述可能會面臨的問題 - 響應慢&#xff0c;雪崩&#xff0c;用戶體驗差&#xff0c;繼而交易…

Linux目錄結構和常用命令

一、Linux目錄結構 你想知道為什么某些程序位于/bin下&#xff0c;或者/sbin&#xff0c;或者/usr/bin&#xff0c;或/usr/sbin目錄下嗎&#xff1f;例如&#xff0c;less命令位于/usr/bin目錄下。為什么沒在/bin中&#xff0c;或/sbin&#xff0c;或/usr/sbin目錄中&#xff1…

掛載nfs文件系統_綜合架構-day38-NFS服務補充

1.如何讓nfs永久掛載-2種方法開機自啟動文件1.vim /etc/rc.d/rc.local需要修改執行權限chmod x /etc/rc.d/rc/localmount -t nfs 172.16.1.31:/upload/ /mnt/2.vim /etc/fstab172.16.1.31:/upload /mnt nfs defaults 0 02.exportfs 加載配置生效&#xff0c;等價于優雅重啟[15:…

A Neural Algorithm of Artistic Style

本系列文章由 yhl_leo 出品&#xff0c;轉載請注明出處。 文章鏈接&#xff1a; http://blog.csdn.net/yhl_leo/article/details/53931536 1. 資源 Paper: A Neural Algorithm of Artistic StyleTensorFlow version in GitHub: anishathalye/neural-styleCaffe version in GitH…

CSS布局奇淫技巧之--各種居中

居中是我們使用css來布局時常遇到的情況。使用css來進行居中時&#xff0c;有時一個屬性就能搞定&#xff0c;有時則需要一定的技巧才能兼容到所有瀏覽器&#xff0c;本文就居中的一些常用方法做個簡單的介紹。 注&#xff1a;本文所講方法除了特別說明外&#xff0c;都是兼容I…

手寫數字識別中多元分類原理_廣告行業中那些趣事系列:從理論到實戰BERT知識蒸餾...

導讀&#xff1a;本文將介紹在廣告行業中自然語言處理和推薦系統實踐。本文主要分享從理論到實戰知識蒸餾&#xff0c;對知識蒸餾感興趣的小伙伴可以一起溝通交流。摘要&#xff1a;本篇主要分享從理論到實戰知識蒸餾。首先講了下為什么要學習知識蒸餾。一切源于業務需求&#…

linux zip/unzip命令

2019獨角獸企業重金招聘Python工程師標準>>> 語  法&#xff1a;zip [-AcdDfFghjJKlLmoqrSTuvVwXyz$][-b <工 作目錄>][-ll][-n <字 尾字符串>][-t <日 期時間>][-<壓 縮效率>][壓 縮文件][文件...][-i <范本樣式>][-x <范本樣式…

離散事件模擬

1. 離散事件系統模擬 被模擬系統的行為&#xff1a; 可以抽象為一些離散事件的發生&#xff1b;所發生事件可以引發新的事件&#xff08;拓撲序&#xff09;&#xff1b;人們希望通過計算機模擬理解系統行為&#xff0c;評價或設計真實世界中實際的或所需的系統&#xff1b;適用…

epoll邊緣觸發_C++回聲服務器_9-epoll邊緣觸發模式版本服務器

epoll默認情況下是水平觸發模式&#xff0c;這次將epoll設置為邊緣觸發模式來實現服務器&#xff0c;而客戶端直接使用完美回聲服務器的客戶端。服務器代碼#include #include #include #include #include #include #include #include #include const int BUF_SIZE 4;const int…

利用dbstart和dbshut腳本自動啟動和停止數據庫的問題

客戶的兩臺IBM Power 740小型機使用HACMP軟件創建互備關系的數據庫服務器&#xff0c;每臺小型機運行一個數據庫&#xff0c;任何一臺服務器出現故障宕機&#xff0c;另一臺小型機應該立即接管&#xff0c;且要一并接管數據庫&#xff0c;這時在一臺小型機上就運行了兩個數據庫…

在Windows下不使用密碼遠程登陸Linux

在登陸Linux進行管理的時候我們通常會使用用戶名和密碼進行登陸&#xff0c;這樣一來是比較麻煩&#xff0c;二來是不安全&#xff0c;為了解決這個問題&#xff0c;我們可以使用公私鑰 (public keys和private keys)進行認證。簡單來說公鑰存放在服務器上&#xff0c;私鑰存放在…

dto 是只給前端需要的數據嗎_DO、VO、DTO...XXOO,你弄明白了么

技術公眾號&#xff1a;Java In Mind(Java_In_Mind),歡迎關注&#xff01;背景我相信&#xff0c;剛開始學習接觸企業代碼的時候&#xff0c;一定會發現&#xff0c;工程中充斥著各種XO&#xff1a;DO、VO、DTO、DAO&#xff0c;還有各種名詞&#xff1a;POJO&#xff0c;JavaB…