首页 > 其他 > 详细

iOS-Socket编程体验

时间:2014-03-08 13:25:53      阅读:622      评论:0      收藏:0      [点我收藏+]

Socket编程体验


bubuko.com,布布扣

Socket编程体验 

bubuko.com,布布扣
bubuko.com,布布扣
bubuko.com,布布扣
bubuko.com,布布扣
bubuko.com,布布扣
bubuko.com,布布扣
bubuko.com,布布扣
bubuko.com,布布扣
bubuko.com,布布扣
bubuko.com,布布扣
bubuko.com,布布扣
bubuko.com,布布扣
bubuko.com,布布扣
bubuko.com,布布扣
bubuko.com,布布扣
bubuko.com,布布扣
bubuko.com,布布扣
bubuko.com,布布扣
bubuko.com,布布扣
bubuko.com,布布扣
bubuko.com,布布扣
bubuko.com,布布扣
bubuko.com,布布扣
bubuko.com,布布扣
bubuko.com,布布扣
bubuko.com,布布扣
bubuko.com,布布扣

网络编程 
? 网络模型OSI(开放系统互联Open SystemInterconnection)TCP/IP
考模型
? 网络通讯要素 - IP地址
端口号传输协议
bubuko.com,布布扣
bubuko.com,布布扣bubuko.com,布布扣bubuko.com,布布扣
bubuko.com,布布扣bubuko.com,布布扣bubuko.com,布布扣
bubuko.com,布布扣bubuko.com,布布扣bubuko.com,布布扣
七层简述 
.1. 物理层:主要定义物理设备标准,如网线的接口类型、各种传输介质的传 输速率等。主要作用是传输比特流(就是由10转化为电流强弱来进行传 输,到达目的地后再转化为10,也就是常说的数模与模数转换)。这一 层的数据叫做比特(bit),主要设备:集线器 
.2. 数据链路层:主要将从物理层接收的数据进行MAC地址的封装与解封装。 常把这一层的数据叫做帧,主要设备:交换机 
.3. 网络层:选择合适的网间路由和交换结点, 确保数据及时传送,将从下层 接收到的数据进行IP地址的封装与解封装。常把这一层数据叫做数据包,主 要设备:路由器。 
.4. 传输层:定义了一些传输数据的协议和端口,如TCPUDP协议,主要将从 下层接收的数据进行分段和传输,到达目的地址后再进行重组,以往把这 一层数据叫做段。 
.5. 会话层:通过传输层建立数据传输通路。在系统之间发起会话或者接受会 话请求(设备之间需要互相认识) 
.6. 表示层:主要是进行对接收的数据进行解释、压缩与解压缩等,即把计算 机能够识别的东西转化成人能够识别的东西(如图片、声音等) 
.7. 应用层:主要是一些终端的应用,比如说FTP(各种文件下载)、浏览器、 QQ等,可以将其理解为在电脑屏幕上可以看到的东西,也就是终端应用。 
bubuko.com,布布扣
网络通讯要素 
? IP地址(唯一标示网络设备的0~255 2^32 = 4G): - 网络中设备的标示不易记忆,可以用主机名-本地回环地址:127.0.0.1 主机名:localhost 
? 端口号(定位程序) 
- 用于标示进程的逻辑地址,不同进程的标示 
- 有效端口:0~65535,其中0~1024由系统使用或者保留端口,开发 中不要使用1024以下的端口 
? 传输协议(用什么样的方式进行交互) - 通讯的规则 
常见协议:TCPUDP 
? http://ip:80/文件路径 => URL(统一资源定位) 
? 资源类型是通过MimeType来区分的,告诉客户端是什么类型的 资源 
bubuko.com,布布扣bubuko.com,布布扣
bubuko.com,布布扣
URL(确定要访问的资源) ?Request=》要访问了Connect=》开始访问....
返回结果
bubuko.com,布布扣bubuko.com,布布扣bubuko.com,布布扣
bubuko.com,布布扣bubuko.com,布布扣bubuko.com,布布扣
bubuko.com,布布扣bubuko.com,布布扣bubuko.com,布布扣
bubuko.com,布布扣bubuko.com,布布扣bubuko.com,布布扣
TCP & UDP 
UDP(用户数据报协议)将数据及源和目的封装成数据包中,不需要建立连接 - 每个数据报的大小限制在64K之内因为无需连接,因此是不可靠协议不需要建立连接,速度快
TCP(传输控制协议)建立连接,形成传输数据的通道在连接中进行大数据传输(数据大小不收限制) - 通过三次握手完成连接,是可靠协议,安全送达 - 必须建立连接,效率会稍低 
bubuko.com,布布扣
Socket(套接字层、插座--AT&T
Socket就是为网络服务提供的一种机制 - Unix中,网络既是Socket,并不局限在TCP/UDP - Socket可以用于自定义协议 QQ
通信的两端都是Socket
网络通信其实就是Socket间的通信数据在两个Socket间通过IO传输 
bubuko.com,布布扣bubuko.com,布布扣
bubuko.com,布布扣bubuko.com,布布扣bubuko.com,布布扣
Socket通讯流程图 
bubuko.com,布布扣bubuko.com,布布扣
使用Socket开发网络通讯 
Web服务(WebServices=>XML)大行其道的今天,调用Web服 务的代价是高昂的,尤其是仅仅是抓取少量数据的时候尤其如 此。而使用Socket,可以只传送数据本身而不用进行XML封装, 大大降低数据传输的开销(JSON)
? Socket允许使用长连接,允许应用程序运行在异步模式(提高 效率),只有在需要的时候才接收数据 
bubuko.com,布布扣
iOS中常用的两种Socket类型 
?? 流式Socket(SOCK_STREAM):流式是一种面向连接的
Socket,针对于面向连接的TCP服务应用
?? 数据报式Socket(SOCK_DGRAM):数据报式Socket是一 种无连接的Socket,对应于无连接的UDP服务应用
bubuko.com,布布扣
iOS中流式Socket连接的方法 
iOS中以NSStream()来发送和接收数据可以设置流的代理,对流状态的变化做出相应
连接建立接收到数据 - 连接关闭
1. NSStream:数据流的父类,用于定义抽象特性,例如:打开、关闭 代理,NSStream继承自CFStream(Core Foundation)
2. NSInputStream:NSStream的子类,用于读取输入 3. NSOutputStream:NSSTream的子类,用于写输出 
bubuko.com,布布扣
开发步骤 
1. 网络连接设置1. 设置网络连接,绑定到主机和端口2. 设置输入流和输出流的代理,监听数据流的状态 3. 将输入输出流添加至运行循环4. 打开输入流和输出流
2. 发送消息给服务器3. 有可读取字节时,读取服务器返回的内容4. 到达流末尾时,关闭流,同时并从主运行循环中删除
bubuko.com,布布扣
设置网络通讯 
CFReadStreamRef readStream;!
CFWriteStreamRef writeStream;!
!
CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"localhost", 12345, &readStream, &writeStream);!
!
_inputStream = (__bridge NSInputStream *)readStream;!_outputStream = (__bridge NSOutputStream*)writeStream;!
说明:CFStreamCreatePairWithSocketToHost函数用于将输入流和输出流 绑定到指定主机的对应端口,连接建立之后,既可以像输入流写入数据, 或者从输出流读取数据

bubuko.com,布布扣
设置流代理并添加至运行循环 
_inputStream.delegate = self;!
_outputStream.delegate = self;!
!
// 将输入、输出流添加至运行循环!
[_inputStream scheduleInRunLoop:[NSRunLoop mainRunLoop]forMode:NSDefaultRunLoopMode];!
[_outputStream scheduleInRunLoop:[NSRunLoop mainRunLoop]forMode:NSDefaultRunLoopMode];!
!
// 打开输入、输出流 [_inputStream open];! [_outputStream open]; 
bubuko.com,布布扣
发送登录请求给服务器 
// 1. 创建要发送的字符串 NSString *sendMsg = [NSStringstringWithFormat:@"iam:%@",
_userNameText.text];!
// 2. 将字符串转换成NSData NSData *sendData = [sendMsgdataUsingEncoding:NSUTF8StringEncoding];! !
// 3. 写入数据 [_outputStream write:[sendData bytes]maxLength:[sendData length]]; 
bubuko.com,布布扣
数据流事件响应 
switch (eventCode) {!
case NSStreamEventOpenCompleted:!
NSLog(@"数据流打开完成");!
break;!
case NSStreamEventHasBytesAvailable:!
NSLog(@"有字节读取");!
break;!
case NSStreamEventHasSpaceAvailable:!
NSLog(@"可以写入数据");!
break;!
case NSStreamEventErrorOccurred:!
NSLog(@"无法连接到服务器");!
break;!
case NSStreamEventEndEncountered:!
NSLog(@“到达流末尾,需要关闭流");!
break;! default:!
NSLog(@"未知");!
break;! } 
bubuko.com,布布扣
有字节读取,则读取从服务器返回消息 
// 服务器返回数据,从输入流中读取数据 // 定义一个字符串缓冲数组,用于接收数据 uint8_t buffer[1024];!
// 送输入流中读取数据,并获得读取内容的长度 int len = [_inputStream read:buffermaxLength:sizeof(buffer)];! !
// 判断是否有读入的内容 if (len > 0) {!
// 将读入的数据转换成字符串 NSString *str = [[NSString alloc] initWithBytes:buffer
length:len encoding:NSUTF8StringEncoding];!NSLog(@"=======> %@", str);!
} 
bubuko.com,布布扣
到达流末尾,关闭流并且从运行循环中删除 [aStreamclose];!
[aStreamremoveFromRunLoop:[NSRunLoopmainRunLoop]forMode:NSDefaultRunLoopMode];!
bubuko.com,布布扣
回顾 
Socket就是为网络服务提供的一种机制?Socket允许使用长连接,允许应用程序运行在异步模式,
只有在需要的时候才接收数据
? 流式Socket(SOCK_STREAM):流式是一种面向连接的 Socket,针对于面向连接的TCP服务应用
bubuko.com,布布扣
Thanks! Q & A 
bubuko.com,布布扣
chenyilong. Powered by Postach.io

iOS-Socket编程体验,布布扣,bubuko.com

iOS-Socket编程体验

原文:http://www.cnblogs.com/ChenYilong/p/3587209.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!