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 ...
随机推荐
- 微软职位内部推荐-Software Engineer
微软近期Open的职位: Job Title: Software Engineer Work Location: Suzhou, China This is a once in a lifetime ...
- nginx反向代理tomcat应用,struts2网站程序redirect时导致请求地址错误的解决方法
一个使用struts2的网站在登录页面需要进行redirect跳转,大致如下: <package name="admin" extends="httl-defaul ...
- @JsonFormat时间格式化注解使用
@JsonFormat注解是一个时间格式化注解,比如我们存储在mysql中的数据是date类型的,当我们读取出来封装在实体类中的时候,就会变成英文时间格式,而不是yyyy-MM-dd HH:mm:ss ...
- WPF和js交互 调用窗体中的方法
public partial class WebTest: Window { private void Window_ContentRendered(object sender, EventArgs ...
- 如何向妻子解释OOD
前言 此文译自CodeProject上<How I explained OOD to my wife>一文,该文章在Top Articles上排名第3,读了之后觉得非常好,就翻译出来, ...
- [转帖]PG里面的Citus简介----找时间学习一下.
1. Citus是什么 是PostgreSQL的扩展,可以同PG一同安装,之后通过SQL命令加入到数据库中. [相关操作] ? 1 2 #创建Citus扩展: CREATE EXTENSION cit ...
- Win2019 preview 版本的安装过程
1. 加入 windows insider 协议 登录自己的账号 同意 insder 协议. 然后 https://www.microsoft.com/en-us/software-download/ ...
- stylus-loader (copy)
https://blog.csdn.net/xqnode/article/details/59777793 "stylus-loader": "^2.5.0", ...
- poj2559 Largest Rectangle in a Histogram(单调栈)
Description A histogram is a polygon composed of a sequence of rectangles aligned at a common base l ...
- 自动化运维—Ansible(上)
一:为什么选择Ansible 相对于puppet和saltstack,ansible无需客户端,更轻量级 ansible甚至都不用启动服务,仅仅只是一个工具,可以很轻松的实现分布式扩展 更强的远程命令 ...