Socket即时通讯小实例

分层原则

1.物理层:主要定义物理设备标准,如网线的接口类型、各种传输介质的传输速率等。主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后再转化为1、0,也就是常说的数模与模数转换)。这一层的数据叫做比特(bit),主要设备:集线器
2.数据链路层:主要将从物理层接收的数据进行MAC地址的封装与解封装。常把这一层的数据叫做帧,主要设备:交换机
3.网络层:选择合适的网间路由和交换结点, 确保数据及时传送,将从下层接收到的数据进行IP地址的封装与解封装。常把这一层数据叫做数据包,主要设备:路由器。
4.传输层:定义了一些传输数据的协议和端口,如TCP、UDP协议,主要将从下层接收的数据进行分段和传输,到达目的地址后再进行重组,以往把这一层数据叫做段。
5.会话层:通过传输层建立数据传输通路。在系统之间发起会话或者接受会话请求(设备之间需要互相认识)
6.表示层:主要是进行对接收的数据进行解释、压缩与解压缩等,即把计算机能够识别的东西转化成人能够识别的东西(如图片、声音等)
7.应用层:主要是一些终端的应用,比如说FTP(各种文件下载)、浏览器、QQ等,可以将其理解为在电脑屏幕上可以看到的东西,也就是终端应用。
 
•UDP(用户数据报协议)
–将数据及源和目的封装成数据包中,不需要建立连接
–每个数据报的大小限制在64K之内
–因为无需连接,因此是不可靠协议
不需要建立连接,速度快
•TCP(传输控制协议)
–建立连接,形成传输数据的通道
–在连接中进行大数据传输(数据大小不收限制
–通过三次握手完成连接,是可靠协议,安全送达
–必须建立连接,效率会稍低
 
•Socket就是为网络服务提供的一种机制
–在Unix中,网络既是Socket,并不局限在TCP/UDP
–  Socket可以用于自定义协议,例如:QQ
•通信的两端都是Socket
•网络通信其实就是Socket间的通信
•数据在两个Socket间通过IO传输
Socket通讯流程图
 
 
•在Web服务(WebServices=>XML)大行其道的今天,调用Web服务的代价是高昂的,尤其是仅仅是抓取少量数据的时候尤其如此。而使用Socket,可以只传送数据本身而不用进行XML封装,大大降低数据传输的开销(JSON)
•Socket允许使用长连接,允许应用程序运行在异步模式(提高效率),只有在需要的时候才接收数据
Ø流式Socket(SOCK_STREAM):流式是一种面向连接的Socket,针对于面向连接的TCP服务应用
Ø数据报式Socket(SOCK_DGRAM):数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用
 
•在iOS中以NSStream(流)来发送和接收数据
•可以设置流的代理,对流状态的变化做出相应
–连接建立
–接收到数据
–连接关闭
1.NSStream:数据流的父类,用于定义抽象特性,例如:打开、关闭代理,NSStream继承自CFStream(Core Foundation)
2.NSInputStream:NSStream的子类,用于读取输入
3.NSOutputStream:NSSTream的子类,用于写输出
 
开发步骤:
1.网络连接设置
1.设置网络连接,绑定到主机和端口
2.设置输入流和输出流的代理,监听数据流的状态
3.将输入输出流添加至运行循环
4.打开输入流和输出流
2.发送消息给服务器
3.有可读取字节时,读取服务器返回的内容
到达流末尾时,关闭流,同时并从主运行循环中删除

/**

 NSStreamEventNone = 0,                         // 无事件

 NSStreamEventOpenCompleted = 1UL << 0,         // 建立连接完成

 NSStreamEventHasBytesAvailable = 1UL << 1,     // 有可读的字节,接收到了数据,可以读了

 NSStreamEventHasSpaceAvailable = 1UL << 2,     // 可以使用输出流的空间,此时可以发送数据给服务器

 NSStreamEventErrorOccurred = 1UL << 3,         // 发生错误

 NSStreamEventEndEncountered = 1UL << 4         // 流结束事件,在此事件中负责做销毁工作

 */

原文地址:https://www.cnblogs.com/BinShao/p/3574280.html