即时通讯
Socket
又称"套接字”
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
应用程序通常通过"套接字"向网络发出请求或者应答网络请求
传输层
TCP:
数据传输协议,通过建立连接传输数据
必须建立连接,效率会稍低,因为安全所以适用于大数据
通过三次握手完成连接,是可靠协议,安全送达
UDP:
用户数据报协议
将数据及源和目的封装成数据包中,不需要建立连接
每个数据报的大小限制在64K之内,速度快,不可靠
因为不可靠,所以数据小,防止一次丢失的大量数据
应用层
数据的传输格式:HTTP协议,XMPP协议。
HTTP:
类似请求头中字典
是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式,HTTP1.1版本中给出一种持续连接的机制,绝大多数的Web开发,都是构建在HTTP协议之上的Web应用。请求由三部分组成,分别是:请求行、消息报头、请求正文
XMPP:
类似XML标签
是即时通讯协议,XMPP是一个典型的C/S(客户端/服务器)架构(补充:B/S==浏览器/服务器)
可扩展消息处理现场协议,是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线现场探测。这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息,XMPP中定义了三个角色,客户端,服务器,网关,基本的网络形式是客户端通过TCP/IP连接到服务器,通过Socket建立连接,然后在之上传输XML流
实现服务端监听Socket
CocoaAsyncSocket第三方框,内部是对C(Socket)的封装
Telnet命令telnet host port/telnet 例:192.168.1.1 5555
telnet命令是连接服务器上的某个端口对应的服务
环信
环信是一个第三平台,提供即时通信(IM –Instant Messaging )的服务
环信是在XMPP的基础上进行二次开发
XMPP问题
1、是一个即时通讯的协议,它规范了用于即时通信在网络上数据传输格式的,比如登录,获取好友列表等等的格式。XMPP在网络传输的数据是XML格式
比如登录:把用户名和密码放在xml的标签中,传输到服务器
2、XMPP是一个基于个Socket通过的网络协议,目的是为了保存长连接,以实现即时通讯功能
3、XMPP的客户端是使用一个XMPPFramework框架实现
4、XMPP的服务器是使用Openfire,一个开源的服务器
5、客户端获取到服务器发送过来的好友消息,客户端需要对XML进行解析,使用的解析框架的KissXML框架,而不是NSXMLParser/GDataXML
6、发送附件(图片,语音,文档…)时比较麻烦
7、XMPP框架没有提供发送附件的功能,需要自己实现
实现方法:把文件上传到文件服务器,上传成功后获取文件保存路径,再把附件的路径发送给好友
环信问题
1、环信是一个即时通信的服务提供商
2、环信使用的是XMPP协议,它是在XMPP的基础上进行二次开发,对服务器Openfire和客户端进行功能模型的添加和客户端SDK的封装,环信的本质还是使用XMPP,基本于Socket的网络通信
3、环信内部实现了数据缓存,会把聊天记录添加到数据库,把附件(如音频文件,图片文件)下载到本地,使程序员更多时间是花到用户即时体验上
4、环信内部已经实现了视频,音频,图片,其它附件发送功能
5、环信使用公司可以节约时间成本
6、不需要公司内部搭建服务器
7、客户端的开发,使用环信SDK比使用XMPPFramework更简洁方便
补充:
网络结构分层:
>
五层 结构
应用层 运输层 网络层 数据链路层 物理层
>
七层结构
应用层 表示层 会话层 运输层 网络层 数据链路层 物理层
>
TCP/IP体系结构
应用层 运输层 网际层(ip) 网络接口层
第七层:应用层
>
定义了用于在网络中进行通信和数据传输的接口 - 用户程式;
提供标准服务,比如虚拟终端、文件以及任务的传输和处理;
>
第六层:表示层
>
掩盖不同系统间的数据格式的不同性;
指定独立结构的数据传输格式;
数据的编码和解码;加密和解密;压缩和解压缩
>
第五层:会话层
>
管理用户会话和对话;
控制用户间逻辑连接的建立和挂断;
报告上一层发生的错误
>
第四层:传输层
>
管理网络中端到端的信息传送;
通过错误纠正和流控制机制提供可靠且有序的数据包传送;
提供面向无连接的数据包的传送;
>
第三层:网络层
>
定义网络设备间如何传输数据;
根据唯一的网络设备地址路由数据包;
提供流和拥塞控制以防止网络资源的损耗
>
第二层:数据链路层
>
定义操作通信连接的程序;
封装数据包为数据帧;
监测和纠正数据包传输错误
>
第一层:物理层
>
定义通过网络设备发送数据的物理方式;
作为网络媒介和设备间的接口;
定义光学、电气以及机械特性。
网际层协议:包括:IP协议、ICMP协议、ARP协议、RARP协议。
传输层协议:TCP协议、UDP协议。
应用层协议:FTP、Telnet、SMTP、HTTP、RIP、NFS、DNS。
TCP、UDP 与 HTTP、XMPP
P:代表协议
TCP、UDP:通过什么样的方式进行交互:传输层协议
HTTP、XMPP:数据是什么样的格式:应用层
三次握手
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
XMPP
xmpp是基于xml的一种协议,他是一种数据的格式,他不是BS的架构,他是一种典型的CS架构,客户端/服务器的架构。
xmpp是为了实现即时通讯,那么他必须建立长链接,并且要是安全的,并且可以传输大数据,所以,一般用TCP方式来传输数据,
因为TCP要建立三次握手,而UDP的方式,由于是不安全的,
并且因为他不安全,所以他每次传输数据的时候数据是比较小的,因为怕丢失大量数据。
xmpp使用XMPPFramework框架,服务器是Openfire。
客户端需要解析对XML解析,需要用到KissXML框架。
通过xmpp来发送文件时,需要将文件通过HTTP来上传给文件服务器,而我们发送给好友的是文件的地址。而环信已经帮我们实现好了。
环信
自动登录原理:
通过将用户名和用户的密码用plist方式保存到沙盒中,并且密码是加密的。再根据一个属性判断是否自动登录,根据这个自动登录来判断客户端是否直接跳转到主界面。
是否登陆成功:判断自动登录成功是根据错误信息是否有值。
当断网:当用户断网时需要通过代理监听网络状态的改变,只要断网就需要提示用户,当恢复网络是,通过代理来链接。
添加好友后,还没有收到回调信息,此时用户返回,控制器销毁,这将导致回调信息监听不到。此时应该将监听好友同意或者拒绝放到appdalegate中或者主界面(会话界面不会轻易销毁的界面)的控制器中。
获取好友列表需要判断是否自动登录成功,只有登录成功类才能获取到好友列表。来刷新数据
提高用户体验:好友列表存放到数据库中,用户直接从本地获取放到内存里面。
如果需要从服务器获取,必须发送请求。
当是第一次网络请求时,从服务器获取,当不是第一次登陆时,直接从数据库中获取数据。
但好友更新之后需要从服务器获取数据来更新好友列表。
退出登陆:设置不绑定deviceToken(不接收推送消息),根据错误信息判断是否退出成功。并回到主界面。
获取聊天记录:根据聊天用户,从内存缓存中找,从数据库中找,创建一个新的回话。还可以根据聊天记录获取指定条数来刷新数据,不需要全部获取。刷新旧的聊天记录,通过时间戳来获取。
音频:录音保存在本地。
播放:判断录音文件是否在本来,在本地就在本地加载播放,在服务器就去服务器获取。
发送图片:根据用户选择的图片生成一个缩略图
显示图片:设置成缩略图的尺寸,判断本地否有缩略图片,有就加载,没有就显示占位图片,再从服务器下载。(SDWebImage下载数据,本地用URL的file开头的属性,网络用URL的URL开头的属性)
使用环信不需要搭建服务器。