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)相关推荐

  1. 朝花夕拾之socket的基本使用以及mina框架简单介绍

    工欲善其事,必先利其器,从互联网诞生到现在,基本上所有的程序都是网络程序,很少有单机版的程序了. 而网络编程的本质是两个设备之间的数据交换,当然,在计算机网络中,设备主要指计算机.我们现在进行网络编程 ...

  2. 网络编程(1)--socket/bind/listen/accept的简单介绍

    网络编程1--socket/bind/listen/accept的简单介绍 背景介绍 网络编程接口 socket bind listen accept 背景介绍 最近在学习APUE和Linux高性能服 ...

  3. Socket编程之简单介绍 - 蓝天下的雨 - 博客园

    Socket编程之简单介绍 - 蓝天下的雨 - 博客园 Socket编程之简单介绍 - 蓝天下的雨 - 博客园 Socket编程之简单介绍 2013-03-19 15:27 by 蓝天下的雨, 878 ...

  4. dubbo学习过程、使用经验分享及实现原理简单介绍

    一.前言 部门去年年中开始各种改造,第一步是模块服务化,这边初选dubbo试用在一些非重要模块上,慢慢引入到一些稍微重要的功能上,半年时间,学习过程及线上使用遇到的些问题在此总结下. 整理这篇文章差不 ...

  5. 基于SIP和RTP协议的开源VOIP之QuteCom简单介绍

    **************************************************************************************************** ...

  6. 什么是套接字?Socket基本介绍

    什么是套接字?Socket基本介绍 一.什么是套接字? 二.套接字特性 三.套接字缓冲区 一.什么是套接字? 套接字是一种通信机制(通信的两方的一种约定),socket屏蔽了各个协议的通信细节,提供了 ...

  7. mysql5.7参数简单介绍

    以下my.cnf简单介绍了各个参数的作用,除了buffer_pool_size,server id等参数需要按照服务器配置修改,其余大部分参数不用修改,可以直接用于生产环境. [client] por ...

  8. dubbo学习过程、使用经验分享及实现原理简单介绍,dubbo经验分享

    原文出处http://blog.csdn.net/hzzhoushaoyu/article/details/43273099 一.前言 部门去年年中开始各种改造,第一步是模块服务化,这边初选dubbo ...

  9. linux环境下的c编程指南,C语言Socket简单编程指南PDF

    1.介绍 Socket 编程让你沮丧吗?从man pages中很难得到有用的信息吗?你想跟上时代去编Internet相关的程序,但是为你在调用 connect() 前的bind() 的结构而不知所措? ...

最新文章

  1. SAP 序列号里'主批次'与'库存批次'不同,如何修改?
  2. 自学python的书籍逐级推荐-适合初学者和经验的十大最佳Python书籍-2018
  3. tensorflow gpu利用率低_「动手学习Tensorflow」- Tensorflow综述I
  4. 《C++ Primer 第五版》(第6.1~6.3节) 函数形参和实参传递,可变参数列表和函数返回值
  5. 撑起百万亿参数模型想象力!英伟达发布新一代SuperPOD超算,AI算力新巅峰!
  6. linux 远程调试文件夹,GDB远程调试开发板程序
  7. linux bash技巧_Bash提示技巧和窍门
  8. Go基础系列:指定goroutine的执行顺序
  9. 传统接口写法与Restful API 区别
  10. Linux:VMware Tools安装方法及共享文件夹设置方法
  11. 并发编程 - io模型 - 总结
  12. 有人很好奇我博客文章的默认展图是怎么弄的?
  13. SEO博客外链怎么做?现在的话是注重站内内容还是什么?
  14. vue项目,解决ie缓存问题
  15. WTP协议简要翻译一(dlmu2001)
  16. Word排版如何快速自动生成目录,简单实用,一看就懂!
  17. mysql那本书适合初学者_8本书让你成为一个更加开放的领导者
  18. java执行sql文件
  19. pandas的DataFrame数据画图matplotlab曲线如何改变时间刻度【间隔时间】并格式化日期显示总结
  20. python图灵_python图灵机器人

热门文章

  1. 基于.NET实现数据挖掘--关联规则分析算法
  2. Linux常用命令备忘(启动管理、文件或目录管理、系统管理)
  3. linux java执行_linux下运行java
  4. NameNode之数据块管理
  5. Hadoop系列-分布式集群
  6. (52)多路时钟复用FPGA如何约束一(片外时钟复用约束)
  7. (72)FPGA面试题-使用不同的代码实现2-4译码器?使用if语句
  8. (17)FPGA面试题永久防止亚稳态发生
  9. System verilog随机系统函数$randomize使用方法
  10. ZYNQ FPGA控制LED灯不闪烁