NSStream实现发送和接受数据
一、基本概念
在iOS中以NSStream(流)来发送和接收数据,可以设置流的代理,对流状态的变化做出相应。
1连接建立
2接收到数据
3连接关闭
NSStream:数据流的父类,用于定义抽象特性,例如:打开、关闭代理,NSStream继承自CFStream(CoreFoundation)
NSInputStream:NSStream的子类,用于读取输入
NSOutputStream:NSSTream的子类,用于写输出
二、开发步骤
1、网络连接设置
设置网络连接,绑定到主机和端口
设置输入流和输出流的代理,监听数据流的状态
将输入输出流添加至运行循环
打开输入流和输出流
2、发送消息给服务器
3、有可读取字节时,读取服务器返回的内容
4、到达流末尾时,关闭流,同时并从主运行循环中删除
#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里实现sokcet的连接,使用C语言
// 1.与服务器通过三次握手建立连接
NSString *host = @"127.0.0.1";
int port = 12345;
// 2.定义输入输出流
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
// 3.分配输入输出流的内存空间
CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)host, port, &readStream, &writeStream);
// 4.把C语言的输入输出流转成OC对象
_inputStream = (__bridge NSInputStream *)readStream;
_outputSteam = (__bridge NSOutputStream *)(writeStream);
// 5.设置代理,监听数据接收的状态
_outputSteam.delegate = self;
_inputStream.delegate = self;
// 把输入输入流添加到主运行循环(RunLoop)
// 主运行循环是监听网络状态
[_outputSteam scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
[_inputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
// 6.打开输入输出流
[_inputStream open];
[_outputSteam open];
}
//代理的回调是在主线程
//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(@"有数据可读");
[self readData];
break;
case NSStreamEventHasSpaceAvailable:
NSLog(@"可以发送数据");
break;
case NSStreamEventErrorOccurred:
NSLog(@"有错误发生,连接失败");
break;
case NSStreamEventEndEncountered:
NSLog(@"正常的断开连接");
//把输入输入流关闭,而还要从主运行循环移除
[_inputStream close];
[_outputSteam close];
[_inputStream removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
[_outputSteam removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
break;
default:
break;
}
}
- (IBAction)loginBtnClick:(id)sender {
//发送登录请求 使用输出流
//拼接登录的指令 iam:zhangsan
NSString *loginStr = @"iam:zhangsan";
//uint8_t * 字符数组
NSData *data = [loginStr dataUsingEncoding:NSUTF8StringEncoding];
[_outputSteam write:data.bytes maxLength:data.length];
}
#pragma mark 读取服务器返回的数据
-(void)readData{
//定义缓冲区 这个缓冲区只能存储1024字节
uint8_t buf[1024];
// 读取数据
// len为从服务器读取到的实际字节数
NSInteger len = [_inputStream read:buf maxLength:sizeof(buf)];
// 把缓冲区里的实现字节数转成字符串
NSString *receiverStr = [[NSString alloc] initWithBytes:buf length:len encoding:NSUTF8StringEncoding];
NSLog(@"%@",receiverStr);
}
@end
NSStream实现发送和接受数据的更多相关文章
- XMPP框架下微信项目总结(7)聊天通信处理-发送,接受数据
前言:通其他的功能处理一样,聊天也是通过模块发起的成为:“消息模块” 原理:1 current客户端开启通过消息模块开启并监听消息(监听通过代理). 2 当“current客户端”收到来自“other ...
- 【城市天气】使用Ajax发送和接受数据
任务:利用中国天气网的公开接口,实现天气预报的查询功能 实验的功能要求如下: (1)当网页加载时,根据所给的 json 数据解析获得省(直辖市)的信息并显示在下拉列表框中供用户选择: (2)当用户选择 ...
- [Socket网络编程]由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)没有提供地址,发送或接收数据的请求没有被接受。
原文地址:http://blog.sina.com.cn/s/blog_70bf579801017ylu.html,记录在此方便查看 解决办法: MSDN的说明: Close 方法可关闭远程主机连接, ...
- 用寄快递模拟数据在网络中的传送过程,发送一个ip数据报到接受这个ip数据报经历的过程
发送一个ip数据报到接受这个ip数据报经历的过程 好比寄一个快递的过程 这个包裹一共有三层, 这个包裹的最里面是数据,数据 第二层写着目的ip地址和源ip地址,即收件人和发件人的姓名 第三层也就是最外 ...
- javaBean默认接受request发送过来的数据,根据键自动设置属性
javaBean默认接受request发送过来的数据,根据键自动设置属性
- socket 错误之:OSError: [WinError 10057] 由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)没有提供地址,发送或接收数据的请求没有被接受。
出错的代码 #server端 import socket import struct sk=socket.socket() sk.bind(('127.0.0.1',8080)) sk.listen( ...
- Asp.net HttpWebRequest和HttpWebResponse发送和接受任何类型数据
发送字符串数据发送数据 string strId = "guest"; "; string postData = "userid=" + strId; ...
- dsp28377控制DM9000收发数据——第三版程序,通过外部引脚触发来实现中断接受数据,优化掉帧现象
//-------------------------------------------------------------------------------------------- - //D ...
- ActionScript接收socket服务器发送来的数据
原文地址:http://www.asp119.com/news/2009522181815_1.htm 从socket中接收数据的方法取决于你使用socket类型,Socket和XMLSocket都可 ...
随机推荐
- IT兄弟连 JavaWeb教程 jQuery中其他AJAX支持的函数
● $.get()函数 $.get(url,data,function,dataType);参数说明如下: url:请求地址 data:请求参数 dataType:服务器返回的数据类型 functi ...
- luogu P4145 上帝造题的七分钟2 / 花神游历各国 维护区间和&&区间开根号
因为开根号能使数字减小得非常快 所以开不了几次(6次?)很大的数就会变成1..... 所以我们可以维护区间最大值,若最大值>1,则继续递归子树,暴力修改叶节点,否则直接return (好像也可以 ...
- java实现access数据上传
一. --springMvc实现上传 https://blog.csdn.net/qian_ch/article/details/69258465 --转换成spring64位上传 https://b ...
- 关于企业邮箱无法提醒解决办法(未安装邮件客户端可添加至网易邮箱大师/qq邮箱等)
关于企业邮箱无法提醒解决办法: 一.使用现有的邮箱客户端,以下以网易的邮箱大师为例mail.exe 点击客户端左边的添加邮箱账号,在出现的对话框中输入账号和密码后,点击登陆按钮后,等待添加完成即可,邮 ...
- 博弈论 && 题目
终于我也开始学博弈了,说了几个月,现在才学.学多点套路,不深学.(~~) 参考刘汝佳蓝书p132 nim游戏: 假设是两维的取石子游戏,每次可以在任意一堆拿任意数量个(至少一根,因为这样游戏的状态集有 ...
- 各种安卓模拟器连接Adb
夜神模拟器:adb connect 127.0.0.1:62001 逍遥安卓模拟器:adb connect 127.0.0.1:21503 天天模拟器:adb connect 127.0.0.1:65 ...
- IIS访问网站出错[要求输入用户名密码]的解决方案
症状: 1.HTTP 500 - 内部服务器错误 2.您不具备使用所提供的凭据查看该目录或页的权限 3.基于所提供的凭据,您没有权限查看此目录或网页.HTTP 错误 401.3 - 访问被资源 ACL ...
- 小G的城堡
B 小 G 的城堡文件名 输入文件 输出文件 时间限制 空间限制castle.pas/c/cpp castle.in castle.out 1s 128MB题目描述小 G 家有一座城堡.城堡里面有 n ...
- Java 2 个 List 集合数据求并、补集操作
开发过程中,我们可能需要对 2 个 或多个 List 集合中的数据进行处理,比如多个 List 集合数据求 相同元素,多个 List 集合数据得到只属于本身的数据,如图示: 这里写图片描述 这里以 2 ...
- IQueryable和IEnumerable的区别