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 ...
随机推荐
- C语言 -- 字符串详解
字符串是一种非常重要的数据类型,但是C语言不存在显式的字符串类型,C语言中的字符串都以字符串常量的形式出现或存储在字符数组中.同时,C 语言提供了一系列库函数来对操作字符串,这些库函数都包含在头文件 ...
- 智能合约bug以及修改方案
截取两篇文章:第一遍文章说的是智能合约能不能修改的问题: ETC转到ETH地址以及转币进ETH智能合约账户能不能转出来? 第0章 引言 如果ETC充值到了ETH地址上,能找回来吗?答案是不一定. ET ...
- Quartz带参数任务的创建与修改
需求背景:创建的quartz任务需要用到三个参数,根据参数去执行并将结果入库,并且参数可修改更新. 这里,有三个参数需要传入,分别是planId.target.officeId 定义Job类: pub ...
- JavaScript学习笔记之JavaScript调用C#编写的COM组件
1.新建一个C#类库项目:MyCom: 2.修改 Properties 目录下的 AssemblyInfo.cs(程序集文件) 中的 ComVisible 属性为 true: 3.项目->属性- ...
- java实验项目报告
JAVA课程项目报告 题目:利用java实现一个时钟的小程序 姓名:王国梁 班级:计科13-2 学号:201303011200 利用JAVA实现一个时钟的小程序 1 ...
- git hub 使用心得
git中重要的概念: 工作目录(working directory):在工作目录中修改文件,修改后的文件状态是modified,新添加的文件是untracked,通过git add命令将文件保存到st ...
- (第三周)使用visual studio 2015进行单元测试
Microsoft visual studio是目前最流行的windows平台应用程序的集成开发环境.最新版本为 Visual Studio 2015 .Visual Studio 2015 包含许多 ...
- springboot+mybatis结合使用
springboot+mybatis结合使用与普通的ssm配置差别不大,但是少了很多的配置,如spring.xml web.xml, 给程序员减轻了很多负担 首先创建带有mybatis框架的项目 ...
- Photoshop一些常用的快捷键
1.按住Alt键,点击图层上的小眼睛,只显示当前图层 2.新建纯色图层,抠图 3.Fn+ num 调整不透明度 4.Shift + num 调整流量 5.调整图层透明度,在移动工具状态下,输入数字:0 ...
- js用currentStyle和getComputedStyle获取css样式(非行间) 兼容ie与火狐
用js的style属性可以获得html标签的样式,但是不能获取非行间样式.那么怎么用js获取css的非行间样式呢?在IE下可以用currentStyle,而在火狐下面我们需要用到getComputed ...