SOCKET访问基本模型

来源:互联网 发布:手机淘宝加入购物车 编辑:程序博客网 时间:2024/05/21 11:00
#import "ViewController.h"@interface ViewController () <NSStreamDelegate>{    NSInputStream *inputStream;    NSOutputStream *outputStream;}@end@implementation ViewController- (void)viewDidLoad{     [super viewDidLoad];}#pragma mark - NSStreamDelegate/** * * *  @param aStream *  @param eventCode NSStreamEventOpenCompleted = 1UL << 0,         //输入输出流打开完成                     NSStreamEventHasBytesAvailable = 1UL << 1,     //有字节可读                     NSStreamEventHasSpaceAvailable = 1UL << 2,     //可以发送字节                     NSStreamEventErrorOccurred = 1UL << 3,         //连接出现错误                     NSStreamEventEndEncountered = 1UL << 4         //连接结束 */- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode{    NSLog(@"%@", aStream );        switch ( eventCode )    {        case NSStreamEventOpenCompleted:            NSLog(@"输入输出流打开完成");            break;                    case NSStreamEventHasBytesAvailable:            NSLog(@"有字节可读");                        [self readData];    //服务器返回数据            break;                    case NSStreamEventHasSpaceAvailable:            NSLog(@"可以发送字节");            break;                    case NSStreamEventErrorOccurred:            NSLog(@"连接出现错误");            break;                    case NSStreamEventEndEncountered:            NSLog(@"连接结束");                        //关闭输入输出流            [inputStream close];            [outputStream close];                        //从主运行循环中移除            [inputStream removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];            [outputStream removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];                        break;                    default:            break;    }}/** *  读取字节数据 */- (void)readData{    //建立一个缓冲区 可以放1024个字节,这里只做理解,实际返回数据可能远不止1024    uint8_t buf[2014];        //length是返回直接可以装的字节数    NSInteger length = [inputStream read:buf maxLength:sizeof(buf)];        //把字节转换成字符串    NSData *data = [NSData dataWithBytes:buf length:length];        //从服务器接收到的数据    NSString *readStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];        NSLog(@"%@", readStr );    }#pragma mark - 连接服务器/** *  连接服务器 */- (IBAction)connectionServer:(id)sender{    //一、建立连接    NSString *host = @"127.0.0.1";    int port = 12345;    CFReadStreamRef readStream;    CFWriteStreamRef writeStream;    CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)host, port, &readStream, &writeStream);  //C语言建立与服务器的连接        //1-1、将C语言的输入输出流转换成OC对象    inputStream = (__bridge NSInputStream *)(readStream);    outputStream = (__bridge NSOutputStream *)(writeStream);        //1-2、设置代理    inputStream.delegate = self;    outputStream.delegate = self;        //1-3、将输入输出流添加到主运行循环    [inputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];    [outputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];        //1-4、打开输入输出流    [inputStream open];    [outputStream open];}#pragma mark - 发送数据/** *  模拟发送数据 */- (IBAction)clickWithSendMessage:(id)sender{    //二、收发数据    //收发数据模拟“用户登录”场景    NSString *loginStr = @"iam:zhangsan";  //特定字符,服务器模拟对象:zhangsan    NSData *data = [loginStr dataUsingEncoding:NSUTF8StringEncoding];    [outputStream write:data.bytes maxLength:data.length];     //write一个流去服务器  write:这里是字节数组   maxLength:长度}@end


0 0
原创粉丝点击