SOCKET访问基本模型
2015-09-16 09:27
369 查看
#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
相关文章推荐
- Effective C++——条款40(第6章)
- 唯一标示
- worldwind参考博客
- unity5+Vuforia SDK5实现高通AR在unity下的环境构建
- 分页计算方式
- Windows 7与 server 2003传输数据慢(netsh int tcp set global autotuninglevel=disable)
- LeetCode Contains Duplicate
- windows系统下搭建svn服务器
- 在jQuery中使用el表达式来设置默认选中值
- android 制作.9.png图片
- codejam 2016 Round A APAC Test
- 产品经理和设计师应该了解的几何设计学
- GeoHash精度
- CComboBox::SetItemData,以及自绘我们的CComBox
- Libevent工作流程
- 算法(1)——递归与分治
- 设计模式--工厂方法模式【Factory Method Pattern】
- 答案实现人机交互智能机器人
- 网页常用的小工具--返回顶部
- 软件工程的实践项目的自我目标