ios 網(wǎng)絡(luò)通信

總結(jié)知識(shí)點(diǎn)兒,僅供參考:如有錯(cuò)誤,歡迎指正;

ios 網(wǎng)絡(luò)通信的方法有兩大類:使用socket方式進(jìn)行通信 和 使用asynsocket類庫(kù)進(jìn)行通信

建議使用的時(shí)候用asynsocket更好些 因?yàn)槭莿e人已經(jīng)封裝好的類庫(kù),比較穩(wěn)定 Socket通信的方法更靈活 因?yàn)榭刂贫际亲约涸谧龅氖虑?/p>

1,直接使用Socket的方式

以TCP為例,對(duì)于TCP來說,區(qū)分服務(wù)端和客戶端.

服務(wù)端:通常的方法是服務(wù)器啟動(dòng)后監(jiān)聽 是否有客戶端連接 如果有連接 則建立與客戶端的通信 客戶端的方法通常是連接服務(wù)端 當(dāng)連接成功后 就希望發(fā)送數(shù)據(jù).

服務(wù)端代碼:

#import"ViewController.h"

// 使用CocoPods使用<>, 可以指定路徑

#import

#import"GNASocket.h"

@interfaceViewController ()

@property(weak, nonatomic) IBOutlet UITextField *portTF;

@property(weak, nonatomic) IBOutlet UITextView *message;// 多行文本輸入框

@property(weak, nonatomic) IBOutlet UITextField *content;

@property(nonatomic, strong) GCDAsyncSocket *clientSocket;// 為客戶端生成的socket

// 服務(wù)器socket

@property(nonatomic, strong) GCDAsyncSocket *serverSocket;

@end

@implementationViewController

- (void)viewDidLoad

{

[superviewDidLoad];

}

// 服務(wù)端監(jiān)聽某個(gè)端口

- (IBAction)listen:(UIButton *)sender

{

// 1. 創(chuàng)建服務(wù)器socket

self.serverSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];

// 2. 開放哪些端口

NSError *error = nil;

BOOL result = [self.serverSocket acceptOnPort:self.portTF.text.integerValue error:&error];

// 3. 判斷端口號(hào)是否開放成功

if(result) {

[self addText:@"端口開放成功"];

}else{

[self addText:@"端口開放失敗"];

}

}

// 發(fā)送

- (IBAction)sendMessage:(UIButton *)sender

{

NSData *data = [self.content.text dataUsingEncoding:NSUTF8StringEncoding];

[self.clientSocket writeData:data withTimeout:-1tag:0];

GNASocket *socket = [GNASocket defaultScocket];

[socket.mySocket readDataWithTimeout:-1tag:0];

}

// 接收消息

- (IBAction)receiveMassage:(UIButton *)sender

{

[self.clientSocket readDataWithTimeout:-1tag:0];

}

// textView填寫內(nèi)容

- (void)addText:(NSString *)text

{

self.message.text = [self.message.text stringByAppendingFormat:@"%@\n", text];

}

- (void)didReceiveMemoryWarning

{

[superdidReceiveMemoryWarning];

}

#pragma mark - GCDAsyncSocketDelegate

// 當(dāng)客戶端鏈接服務(wù)器端的socket, 為客戶端單生成一個(gè)socket

- (void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket

{

[self addText:@"鏈接成功"];

//IP: newSocket.connectedHost

//端口號(hào): newSocket.connectedPort

[self addText:[NSString stringWithFormat:@"鏈接地址:%@", newSocket.connectedHost]];

[self addText:[NSString stringWithFormat:@"端口號(hào):%hu", newSocket.connectedPort]];

// short: %hd

// unsigned short: %hu

// 存儲(chǔ)新的端口號(hào)

self.clientSocket = newSocket;

}

- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag

{

NSString *message = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

[self addText:message];

}

@end

客戶端代碼:

#import"SecondViewController.h"

#import

#import"GNASocket.h"

@interfaceSecondViewController ()

@property(weak, nonatomic) IBOutlet UITextField *addressTF;

@property(weak, nonatomic) IBOutlet UITextField *portTF;

@property(weak, nonatomic) IBOutlet UITextField *message;

@property(weak, nonatomic) IBOutlet UITextView *content;

@property(nonatomic, strong) GCDAsyncSocket *socket;

@end

@implementationSecondViewController

- (void)viewDidLoad

{

[superviewDidLoad];

}

// 和服務(wù)器進(jìn)行鏈接

- (IBAction)connect:(UIButton *)sender

{

// 1. 創(chuàng)建socket

self.socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];

// 2. 與服務(wù)器的socket鏈接起來

NSError *error = nil;

BOOL result = [self.socket connectToHost:self.addressTF.text onPort:self.portTF.text.integerValue error:&error];

// 3. 判斷鏈接是否成功

if(result) {

[self addText:@"客戶端鏈接服務(wù)器成功"];

}else{

[self addText:@"客戶端鏈接服務(wù)器失敗"];

}

}

// 接收數(shù)據(jù)

- (IBAction)receiveMassage:(UIButton *)sender

{

[self.socket readDataWithTimeout:-1tag:0];

}

// 發(fā)送消息

- (IBAction)sendMassage:(UIButton *)sender

{

[self.socket writeData:[self.message.text dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1tag:0];

}

// textView填寫內(nèi)容

- (void)addText:(NSString *)text

{

self.content.text = [self.content.text stringByAppendingFormat:@"%@\n", text];

}

- (void)didReceiveMemoryWarning

{

[superdidReceiveMemoryWarning];

}

#pragma mark - GCDAsyncSocketDelegate

// 客戶端鏈接服務(wù)器端成功, 客戶端獲取地址和端口號(hào)

- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port

{

[self addText:[NSString stringWithFormat:@"鏈接服務(wù)器%@", host]];

GNASocket *socket = [GNASocket defaultScocket];

socket.mySocket = self.socket;

}

// 客戶端已經(jīng)獲取到內(nèi)容

- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag

{

NSString *content = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

[self addText:content];

}

@end


為通信傳值寫一個(gè)單例:


#import

#import

@interfaceGNASocket : NSObject

@property(nonatomic, strong) GCDAsyncSocket *mySocket;

+ (GNASocket *)defaultScocket;

@end

//.m

#import"GNASocket.h"

@implementationGNASocket

+ (GNASocket *)defaultScocket

{

staticGNASocket *socket = nil;

staticdispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

socket = [[GNASocket alloc] init];

});

returnsocket;

}

效果圖:


@end

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蚪战,一起剝皮案震驚了整個(gè)濱河市峭范,隨后出現(xiàn)的幾起案子山卦,更是在濱河造成了極大的恐慌,老刑警劉巖盒粮,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡浸颓,警方通過查閱死者的電腦和手機(jī)镊逝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門壮啊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人撑蒜,你說我怎么就攤上這事歹啼⌒” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵狸眼,是天一觀的道長(zhǎng)藤树。 經(jīng)常有香客問我,道長(zhǎng)份企,這世上最難降的妖魔是什么也榄? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮司志,結(jié)果婚禮上甜紫,老公的妹妹穿的比我還像新娘。我一直安慰自己骂远,他們只是感情好囚霸,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著激才,像睡著了一般拓型。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瘸恼,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天劣挫,我揣著相機(jī)與錄音,去河邊找鬼东帅。 笑死压固,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的靠闭。 我是一名探鬼主播帐我,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼愧膀!你這毒婦竟也來了拦键?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤檩淋,失蹤者是張志新(化名)和其女友劉穎芬为,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蟀悦,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡碳柱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了熬芜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片莲镣。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖涎拉,靈堂內(nèi)的尸體忽然破棺而出瑞侮,到底是詐尸還是另有隱情的圆,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布半火,位于F島的核電站越妈,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏钮糖。R本人自食惡果不足惜梅掠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望店归。 院中可真熱鬧阎抒,春花似錦、人聲如沸消痛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)秩伞。三九已至逞带,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間纱新,已是汗流浹背展氓。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留脸爱,地道東北人遇汞。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像阅羹,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子教寂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容