一、基本概念
在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实现发送和接受数据的更多相关文章

  1. XMPP框架下微信项目总结(7)聊天通信处理-发送,接受数据

    前言:通其他的功能处理一样,聊天也是通过模块发起的成为:“消息模块” 原理:1 current客户端开启通过消息模块开启并监听消息(监听通过代理). 2 当“current客户端”收到来自“other ...

  2. 【城市天气】使用Ajax发送和接受数据

    任务:利用中国天气网的公开接口,实现天气预报的查询功能 实验的功能要求如下: (1)当网页加载时,根据所给的 json 数据解析获得省(直辖市)的信息并显示在下拉列表框中供用户选择: (2)当用户选择 ...

  3. [Socket网络编程]由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)没有提供地址,发送或接收数据的请求没有被接受。

    原文地址:http://blog.sina.com.cn/s/blog_70bf579801017ylu.html,记录在此方便查看 解决办法: MSDN的说明: Close 方法可关闭远程主机连接, ...

  4. 用寄快递模拟数据在网络中的传送过程,发送一个ip数据报到接受这个ip数据报经历的过程

    发送一个ip数据报到接受这个ip数据报经历的过程 好比寄一个快递的过程 这个包裹一共有三层, 这个包裹的最里面是数据,数据 第二层写着目的ip地址和源ip地址,即收件人和发件人的姓名 第三层也就是最外 ...

  5. javaBean默认接受request发送过来的数据,根据键自动设置属性

    javaBean默认接受request发送过来的数据,根据键自动设置属性

  6. socket 错误之:OSError: [WinError 10057] 由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)没有提供地址,发送或接收数据的请求没有被接受。

    出错的代码 #server端 import socket import struct sk=socket.socket() sk.bind(('127.0.0.1',8080)) sk.listen( ...

  7. Asp.net HttpWebRequest和HttpWebResponse发送和接受任何类型数据

    发送字符串数据发送数据 string strId = "guest"; "; string postData = "userid=" + strId; ...

  8. dsp28377控制DM9000收发数据——第三版程序,通过外部引脚触发来实现中断接受数据,优化掉帧现象

    //-------------------------------------------------------------------------------------------- - //D ...

  9. ActionScript接收socket服务器发送来的数据

    原文地址:http://www.asp119.com/news/2009522181815_1.htm 从socket中接收数据的方法取决于你使用socket类型,Socket和XMLSocket都可 ...

随机推荐

  1. UVALive - 3695 Distant Galaxy

    InputThere are multiple test cases in the input file. Each test case starts with one integer N, (1 ≤ ...

  2. EF升级 反射重载方法ApplyConfiguration

    protected override void OnModelCreating(ModelBuilder builder) { base.OnModelCreating(builder); //var ...

  3. 整理的各种模板 (随时弃坑emmmmm)

    线段树: #include<iostream> #include<cstdio> #include<algorithm> #include<cmath> ...

  4. UML工具 PlantUML SequenceDiagram

  5. render函数和redirect函数的区别+反向解析

    render函数和redirect函数的区别+反向解析 1.视图函数:一定是要包含两个对象的(render源码里面有HttpResponse对象)   request对象:----->所有的请求 ...

  6. python进阶09 MySQL高级查询

    python进阶09 MySQL高级查询 一.筛选条件 # 比较运算符 # 等于:= 不等于:!= 或<> 大于:> 小于:< 大于等于>= 小于等于:<= #空: ...

  7. HDU-1269-迷宫城堡(强连通 模板)

    链接:https://vjudge.net/problem/HDU-1269 题意: 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M< ...

  8. 爬虫(GET)——handler处理器和自定义opener

    工具:python3 解释:urlopen()不支持代理.cookie等其他的http/https高级功能,所以需要handler处理器创建特定功能的处理器对象,urllib.request.buli ...

  9. Linux 解压压缩war包

    jar -xvf aaa.war   (jar只能解压war 包到当前目录下) unzip aaa.war -d aaa/   (解压war包到aaa目录下) 打包aaa 下的所有文件为aaa.war ...

  10. RTX51 Tiny

    参考文档 :RTX51 Tiny 2.02 中文手册.doc.Keil_Rtx51_tiny_RTOS中文版.pdf RTX-51 有 2 个版本:Full 和 Tiny.类似的国人写的 Small ...