iOS中NSStream實(shí)現(xiàn)發(fā)送和接受數(shù)據(jù)

一、基本概念
在iOS中以NSStream(流)來發(fā)送和接收數(shù)據(jù),可以設(shè)置流的代理,對(duì)流狀態(tài)的變化做出相應(yīng)。
1連接建立
2接收到數(shù)據(jù)
3連接關(guān)閉
NSStream:數(shù)據(jù)流的父類,用于定義抽象特性,例如:打開、關(guān)閉代理,NSStream繼承自CFStream(CoreFoundation)
NSInputStream:NSStream的子類,用于讀取輸入
NSOutputStream:NSSTream的子類,用于寫輸出

二、開發(fā)步驟
1、網(wǎng)絡(luò)連接設(shè)置
設(shè)置網(wǎng)絡(luò)連接,綁定到主機(jī)和端口
設(shè)置輸入流和輸出流的代理,監(jiān)聽數(shù)據(jù)流的狀態(tài)
將輸入輸出流添加至運(yùn)行循環(huán)
打開輸入流和輸出流
2、發(fā)送消息給服務(wù)器
3、有可讀取字節(jié)時(shí),讀取服務(wù)器返回的內(nèi)容
4、到達(dá)流末尾時(shí),關(guān)閉流,同時(shí)并從主運(yùn)行循環(huán)中刪除

#import "ViewController.h"

@interface ViewController ()<NSStreamDelegate>{
    NSInputStream *_inputStream;
    NSOutputStream *_outputSteam;
}

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}


- (IBAction)connectToServer:(id)sender {
    //ios里實(shí)現(xiàn)sokcet的連接,使用C語言
    
    // 1.與服務(wù)器通過三次握手建立連接
    NSString *host = @"127.0.0.1";
    int port = 12345;
    
    // 2.定義輸入輸出流
    CFReadStreamRef readStream;
    CFWriteStreamRef writeStream;
    
    // 3.分配輸入輸出流的內(nèi)存空間
    CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)host, port, &readStream, &writeStream);
    
    // 4.把C語言的輸入輸出流轉(zhuǎn)成OC對(duì)象
    _inputStream = (__bridge NSInputStream *)readStream;
    _outputSteam = (__bridge NSOutputStream *)(writeStream);
    
    // 5.設(shè)置代理,監(jiān)聽數(shù)據(jù)接收的狀態(tài)
    _outputSteam.delegate = self;
    _inputStream.delegate = self;
    
    // 把輸入輸入流添加到主運(yùn)行循環(huán)(RunLoop)
    // 主運(yùn)行循環(huán)是監(jiān)聽網(wǎng)絡(luò)狀態(tài)
    [_outputSteam scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
    [_inputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
    
    
    // 6.打開輸入輸出流
    [_inputStream open];
    [_outputSteam open];
}


//代理的回調(diào)是在主線程
//NSLog(@"%@",[NSThread currentThread]);
-(void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode{

//    NSStreamEventOpenCompleted = 1UL << 0,
//    NSStreamEventHasBytesAvailable = 1UL << 1,
//    NSStreamEventHasSpaceAvailable = 1UL << 2,
//    NSStreamEventErrorOccurred = 1UL << 3,
//    NSStreamEventEndEncountered = 1UL << 4
    
    switch (eventCode) {
        case NSStreamEventOpenCompleted:
            NSLog(@"%@",aStream);
            NSLog(@"成功連接建立,形成輸入輸出流的傳輸通道");
            break;
            
        case NSStreamEventHasBytesAvailable:
            NSLog(@"有數(shù)據(jù)可讀");
            [self readData];
            break;
            
        case NSStreamEventHasSpaceAvailable:
            NSLog(@"可以發(fā)送數(shù)據(jù)");
            break;
            
         case NSStreamEventErrorOccurred:
            NSLog(@"有錯(cuò)誤發(fā)生,連接失敗");
            break;
            
         case NSStreamEventEndEncountered:
            NSLog(@"正常的斷開連接");
            //把輸入輸入流關(guān)閉,而還要從主運(yùn)行循環(huán)移除
            [_inputStream close];
            [_outputSteam close];
            [_inputStream removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
            [_outputSteam removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];

            break;
        default:
            break;
    }

}

- (IBAction)loginBtnClick:(id)sender {
    //發(fā)送登錄請(qǐng)求 使用輸出流
    
    //拼接登錄的指令 iam:zhangsan
    NSString *loginStr = @"iam:zhangsan";
    
    //uint8_t * 字符數(shù)組
    NSData *data = [loginStr dataUsingEncoding:NSUTF8StringEncoding];
    [_outputSteam write:data.bytes maxLength:data.length];
    
}


#pragma mark 讀取服務(wù)器返回的數(shù)據(jù)
-(void)readData{
    
    //定義緩沖區(qū) 這個(gè)緩沖區(qū)只能存儲(chǔ)1024字節(jié)
    uint8_t buf[1024];
    
    // 讀取數(shù)據(jù)
    // len為從服務(wù)器讀取到的實(shí)際字節(jié)數(shù)
    NSInteger len = [_inputStream read:buf maxLength:sizeof(buf)];
    
    // 把緩沖區(qū)里的實(shí)現(xiàn)字節(jié)數(shù)轉(zhuǎn)成字符串
    NSString *receiverStr = [[NSString alloc] initWithBytes:buf length:len encoding:NSUTF8StringEncoding];
    NSLog(@"%@",receiverStr);

}
@end

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容