iOS-Socket编程体验
Socket编程体验




























、0转化为电流强弱来进行传 输,到达目的地后再转化为1、0,也就是常说的数模与模数转换)。这一 层的数据叫做比特(bit),主要设备:集线器
.2. 数据链路层:主要将从物理层接收的数据进行MAC地址的封装与解封装。 常把这一层的数据叫做帧,主要设备:交换机
.3. 网络层:选择合适的网间路由和交换结点, 确保数据及时传送,将从下层 接收到的数据进行IP地址的封装与解封装。常把这一层数据叫做数据包,主 要设备:路由器。
.4. 传输层:定义了一些传输数据的协议和端口,如TCP、UDP协议,主要将从 下层接收的数据进行分段和传输,到达目的地址后再进行重组,以往把这 一层数据叫做段。
.5. 会话层:通过传输层建立数据传输通路。在系统之间发起会话或者接受会 话请求(设备之间需要互相认识)
.6. 表示层:主要是进行对接收的数据进行解释、压缩与解压缩等,即把计算 机能够识别的东西转化成人能够识别的东西(如图片、声音等)
.7. 应用层:主要是一些终端的应用,比如说FTP(各种文件下载)、浏览器、 QQ等,可以将其理解为在电脑屏幕上可以看到的东西,也就是终端应用。

网络通讯要素
• IP地址(唯一标示网络设备的0~255 2^32 = 4G): - 网络中设备的标示- 不易记忆,可以用主机名-本地回环地址:127.0.0.1 主机名:localhost
• 端口号(定位程序)
- 用于标示进程的逻辑地址,不同进程的标示
- 有效端口:0~65535,其中0~1024由系统使用或者保留端口,开发 中不要使用1024以下的端口
• 传输协议(用什么样的方式进行交互) - 通讯的规则
- 常见协议:TCP、UDP
• http://ip:80/文件路径 => URL(统一资源定位)
• 资源类型是通过MimeType来区分的,告诉客户端是什么类型的 资源



• URL(确定要访问的资源) •Request=》要访问了• Connect=》开始访问• ....
• 返回结果












TCP & UDP
• UDP(用户数据报协议)- 将数据及源和目的封装成数据包中,不需要建立连接 - 每个数据报的大小限制在64K之内- 因为无需连接,因此是不可靠协议- 不需要建立连接,速度快
• TCP(传输控制协议)- 建立连接,形成传输数据的通道- 在连接中进行大数据传输(数据大小不收限制) - 通过三次握手完成连接,是可靠协议,安全送达 - 必须建立连接,效率会稍低

Socket(套接字层、插座--AT&T)
• Socket就是为网络服务提供的一种机制 - 在Unix中,网络既是Socket,并不局限在TCP/UDP - Socket可以用于自定义协议 QQ
• 通信的两端都是Socket
• 网络通信其实就是Socket间的通信• 数据在两个Socket间通过IO传输





Socket通讯流程图


使用Socket开发网络通讯
• 在Web服务(WebServices=>XML)大行其道的今天,调用Web服 务的代价是高昂的,尤其是仅仅是抓取少量数据的时候尤其如 此。而使用Socket,可以只传送数据本身而不用进行XML封装, 大大降低数据传输的开销(JSON)
, &readStream, &writeStream);!
!
_inputStream = (__bridge NSInputStream *)readStream;!_outputStream = (__bridge NSOutputStream*)writeStream;!
说明:CFStreamCreatePairWithSocketToHost函数用于将输入流和输出流 绑定到指定主机的对应端口,连接建立之后,既可以像输入流写入数据, 或者从输出流读取数据

设置流代理并添加至运行循环
_inputStream.delegate = self;!
_outputStream.delegate = self;!
!
// 将输入、输出流添加至运行循环!
[_inputStream scheduleInRunLoop:[NSRunLoop mainRunLoop]forMode:NSDefaultRunLoopMode];!
[_outputStream scheduleInRunLoop:[NSRunLoop mainRunLoop]forMode:NSDefaultRunLoopMode];!
!
// 打开输入、输出流 [_inputStream open];! [_outputStream open]; 
发送登录请求给服务器
// 1. 创建要发送的字符串 NSString *sendMsg = [NSStringstringWithFormat:@"iam:%@",
_userNameText.text];!
// 2. 将字符串转换成NSData NSData *sendData = [sendMsgdataUsingEncoding:NSUTF8StringEncoding];! !
// 3. 写入数据 [_outputStream write:[sendData bytes]maxLength:[sendData length]]; 
数据流事件响应
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;! } 
有字节读取,则读取从服务器返回消息
// 服务器返回数据,从输入流中读取数据 // 定义一个字符串缓冲数组,用于接收数据 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);!
} 
到达流末尾,关闭流并且从运行循环中删除 • [aStreamclose];!
• [aStreamremoveFromRunLoop:[NSRunLoopmainRunLoop]forMode:NSDefaultRunLoopMode];!
回顾
• Socket就是为网络服务提供的一种机制•Socket允许使用长连接,允许应用程序运行在异步模式,
只有在需要的时候才接收数据
• 流式Socket(SOCK_STREAM):流式是一种面向连接的 Socket,针对于面向连接的TCP服务应用
Thanks! Q & A 
iOS-Socket编程体验的更多相关文章
- iOS Socket编程-C语言版(TCP)
. TCP Socket编程 TCP是面向连接的,安全可靠的传输层协议.TCP的程序基本框架设计图: TCP的程序基本框架设计图.jpg 注意:Socket通信一定有要服务端和客户端. 1.1 TCP ...
- iOS Socket编程-C语言版(UDP)
. UDP Socket编程 先讲一讲UDP编程,因为比TCP要简单多了.首先,我们需要明白UDP是用户数据报协议,英文名为User Datagram Protocol,它是面向无连接的. 注意:So ...
- IOS - socket 编程初体验
#import "ViewController.h" @interface ViewController () <NSStreamDelegate, UITextFieldD ...
- iOS socket编程 第三方库 AsyncSocket(GCDAsyncSocket)
Socket描述了一个IP.端口对.它简化了程序员的操作,知道对方的IP以及PORT就可以给对方发送消息,再由服务器端来处理发送的这些消息.所以,Socket一定包含了通信的双发,即客户端(Clien ...
- IOS socket编程--Asyncsocket
iPhone的标准推荐是CFNetwork 库编程,其封装好的开源库是 cocoa AsyncSocket库,用它来简化CFNetwork的调用,它提供了异步操作 主要特性有: 队列的非阻塞的读和写, ...
- iOS socket编程
// // ViewController.m // socket // // Created by emerys on 16/3/2. // Copyright © 2016年 Emerys. All ...
- iOS Socket编程(一)基本概念
1.Socket的解释 Socket翻译过来中文称为套接字, 这里我找到了一段比较官方的解释Socket是什么东西: Socket是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元,包含进行 ...
- 《网络安全编程基础》之Socket编程
<网络安全编程基础>之Socket编程 我的代码 server.c // server.cpp : Defines the entry point for the console appl ...
- iOS 网络编程:socket
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...
随机推荐
- 复习下VLAN的知识
转载:来自百度百科 VLAN一般指虚拟局域网 VLAN(Virtual Local Area Network)的中文名为"虚拟局域网". 虚拟局域网(VLAN)是一组逻辑上的设备和 ...
- 继承 多态 java相关基础知识
1:静态语句块.构造语句块(就是只有大括号的那块)以及构造函数的执行顺序 例子: class HelloA { public HelloA() { System.out.println("H ...
- 对《OA云》作品的分析
对<OA云>作品的分析 软件描述:<OA云>是一款基于移动端的企业日常事物办公软件,企业人员进入该产品后可以对当天的出勤情况进行签到,系统会自动的识别以及记录下员工的实时签到信 ...
- 哥java学识有大进 干回之前的小学生系统像切菜一样简单 不说了 来代码
package runok; import java.util.*; import java.awt.*; import java.awt.event.ActionEvent; import java ...
- FINAL视频预发布
视频地址:http://v.youku.com/v_show/id_XMTg0MjMzNDIwNA==.html?spm=a2hzp.8253869.0.0&from=y1.7-2
- 常用的cpl 命令 运行直接打开控制台的简单方法
转载百度百科 工作中处理 windows机器 有时候 打开 网路修改ip地址特别繁琐,所以找了下 快速打开一些简单的控制台 能提高工作效率. (Control Panel extension) ...
- sql 索引 sql_safe_updates
为了数据的安全性,mysql有一个安全性设置,sql_safe_updates ,当把这个值设置成1的时候,当程序要对数据进行修改删除操作的时候条件必须要走索引. 刚好现在也碰到了此类问题:网上找了相 ...
- Java之utf8中文编码转换
import org.apache.commons.codec.binary.Hex; import org.junit.Test; /** * HBASE中文转换 */ public class C ...
- BOM之navigator对象和用户代理检测
前面的话 navigator对象现在已经成为识别客户端浏览器的事实标准,navigator对象是所有支持javascript的浏览器所共有的.本文将详细介绍navigator对象和用户代理检测 属性 ...
- DBA 这个角色
下面这些领域的技能可以提升DBA团队对公司业务产生正面影响的重要能力: ---------------------------------------------------------------- ...