Socket简单介绍(通过NSStream)
Socket通过io传输,以二进制流的方式(数据流)对数据进行传输。数据在两端的Socket之间通过io进行传输数据。通过客户端和服务器之间传输数据。
IOS以NSStream的方式来发送数据和接受数据。通过数据流的代理对数据的变化做出响应。
建立连接的步骤:
1.设置网络连接,绑定主机和端口
2.设置输入和输出流的代理,监听数据的变化状态
3.将输入输出流添加至runloop。
4.打开输入和输出流
5.接受消息或者发送数据
6.读取输入流的数据和
7.到达数据流末尾时,关闭数据流,移除runloop
数据流的状态枚举:
/*NSStreamEventNone // 无事件NSStreamEventOpenCompleted // 建立连接完成NSStreamEventHasBytesAvailable // 有可读的字节,接收到了数据,可以读了NSStreamEventHasSpaceAvailable // 可以使用输出流的空间,此时可以发送数据给服务器NSStreamEventErrorOccurred // 发生错误NSStreamEventEndEncountered // 流结束事件,在此事件中负责做销毁工作*/
实例:
1.添加队列
NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(loadDataServer:) object:url];[thread start];//添加队列
2.设置网络连接和代理等一系列设置
-(void)loadDataServer:(NSURL *)url {CFReadStreamRef readStream;CFWriteStreamRef writeStream;CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)([url host]), [[url port] integerValue], &readStream, &writeStream);//建立连接 _input = (__bridge NSInputStream *)(readStream);_output = (__bridge NSOutputStream *)(writeStream);_input.delegate = self;//设置代理[_input scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];//添加到runloop[_input open];//打开 _output.delegate = self;[_output scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];[_output open];[[NSRunLoop currentRunLoop]run]; }
3.查看数据流状态
//设置对应代理 -(void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode {switch (eventCode) {case NSStreamEventNone:{//无事件; }break;case NSStreamEventOpenCompleted:{//建立连接完成 }break;//接收到数据,有可读字节case NSStreamEventHasBytesAvailable:{if (_receivedData == nil) {_receivedData = [[NSMutableData alloc]init];}uint8_t buffer[1024];NSInteger numBtyes = [(NSInputStream *)aStream read:buffer maxLength:sizeof(buffer)];if (numBtyes > 0) {NSString *str = [[NSString alloc]initWithBytes:buffer length:numBtyes encoding:NSUTF8StringEncoding];NSLog(@"%@",str);}}break;case NSStreamEventHasSpaceAvailable:{//可以写入数据 }break;case NSStreamEventErrorOccurred:{//发生错误 }break;case NSStreamEventEndEncountered:{//流结束,此处进行销毁 [aStream close];[aStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];}break;default:break;} }
4.发送数据
- (IBAction)click:(id)sender {NSString *mytext = @"moxue";NSData *data = [mytext dataUsingEncoding:NSUTF8StringEncoding];[_output write:data.bytes maxLength:data.length]; }
转载于:https://www.cnblogs.com/moxuexiaotong/p/4972626.html
Socket简单介绍(通过NSStream)相关推荐
- 朝花夕拾之socket的基本使用以及mina框架简单介绍
工欲善其事,必先利其器,从互联网诞生到现在,基本上所有的程序都是网络程序,很少有单机版的程序了. 而网络编程的本质是两个设备之间的数据交换,当然,在计算机网络中,设备主要指计算机.我们现在进行网络编程 ...
- 网络编程(1)--socket/bind/listen/accept的简单介绍
网络编程1--socket/bind/listen/accept的简单介绍 背景介绍 网络编程接口 socket bind listen accept 背景介绍 最近在学习APUE和Linux高性能服 ...
- Socket编程之简单介绍 - 蓝天下的雨 - 博客园
Socket编程之简单介绍 - 蓝天下的雨 - 博客园 Socket编程之简单介绍 - 蓝天下的雨 - 博客园 Socket编程之简单介绍 2013-03-19 15:27 by 蓝天下的雨, 878 ...
- dubbo学习过程、使用经验分享及实现原理简单介绍
一.前言 部门去年年中开始各种改造,第一步是模块服务化,这边初选dubbo试用在一些非重要模块上,慢慢引入到一些稍微重要的功能上,半年时间,学习过程及线上使用遇到的些问题在此总结下. 整理这篇文章差不 ...
- 基于SIP和RTP协议的开源VOIP之QuteCom简单介绍
**************************************************************************************************** ...
- 什么是套接字?Socket基本介绍
什么是套接字?Socket基本介绍 一.什么是套接字? 二.套接字特性 三.套接字缓冲区 一.什么是套接字? 套接字是一种通信机制(通信的两方的一种约定),socket屏蔽了各个协议的通信细节,提供了 ...
- mysql5.7参数简单介绍
以下my.cnf简单介绍了各个参数的作用,除了buffer_pool_size,server id等参数需要按照服务器配置修改,其余大部分参数不用修改,可以直接用于生产环境. [client] por ...
- dubbo学习过程、使用经验分享及实现原理简单介绍,dubbo经验分享
原文出处http://blog.csdn.net/hzzhoushaoyu/article/details/43273099 一.前言 部门去年年中开始各种改造,第一步是模块服务化,这边初选dubbo ...
- linux环境下的c编程指南,C语言Socket简单编程指南PDF
1.介绍 Socket 编程让你沮丧吗?从man pages中很难得到有用的信息吗?你想跟上时代去编Internet相关的程序,但是为你在调用 connect() 前的bind() 的结构而不知所措? ...
最新文章
- SAP 序列号里'主批次'与'库存批次'不同,如何修改?
- 自学python的书籍逐级推荐-适合初学者和经验的十大最佳Python书籍-2018
- tensorflow gpu利用率低_「动手学习Tensorflow」- Tensorflow综述I
- 《C++ Primer 第五版》(第6.1~6.3节) 函数形参和实参传递,可变参数列表和函数返回值
- 撑起百万亿参数模型想象力!英伟达发布新一代SuperPOD超算,AI算力新巅峰!
- linux 远程调试文件夹,GDB远程调试开发板程序
- linux bash技巧_Bash提示技巧和窍门
- Go基础系列:指定goroutine的执行顺序
- 传统接口写法与Restful API 区别
- Linux:VMware Tools安装方法及共享文件夹设置方法
- 并发编程 - io模型 - 总结
- 有人很好奇我博客文章的默认展图是怎么弄的?
- SEO博客外链怎么做?现在的话是注重站内内容还是什么?
- vue项目,解决ie缓存问题
- WTP协议简要翻译一(dlmu2001)
- Word排版如何快速自动生成目录,简单实用,一看就懂!
- mysql那本书适合初学者_8本书让你成为一个更加开放的领导者
- java执行sql文件
- pandas的DataFrame数据画图matplotlab曲线如何改变时间刻度【间隔时间】并格式化日期显示总结
- python图灵_python图灵机器人