近期要开发即时通讯,先看了理论概念,总结一下。
即使通讯一般涉及到的协议是传输层协议和应用层协议,传输层有TCP连接和UDP连接,先简单的说下2者的区别:
1.TCP需要三次握手建立连接,而UDP不需要建立连接,所以TCP属于可靠的传输协议,UDP是一种不可靠的传输
协议,UDP所谓的连接相当于一种影射,UDP单方面认为目标地址(端口)是可用的,从而首发数据,而实际是未
必可用,所以传输不可靠。由于TCP需要建立真实的连接,所以需要消耗服务器的负载大于UDP。
从二者的区别中能够总结出:在做即时通讯的APP时,如果是信息量很大的APP就需要用UDP(例如QQ微信两种
协议都在用),如果聊天不用主打功能(或者是小公司技术不是很成熟的公司),用TCP就好了,因为UDP需要
做的事很多,比如传输可靠行和丢失数据包的问题。
2.下一个用到的概念是socket,简单的说socket就是对传输层TCP和UDP一种封装,由于在编程的时候写TCP或者
UDP的代码太过底层,所以用C语言封装和传输层协议,暴露出接口供程序员调用。举个例子说明:TCP建立连接
的时候需要三次握手,在我们写client和server连接的时候三次握手就不用写了,在基于socket的一些框架中简单的
几行代码就能搞定(如CocoaAsyncSocket框架)。socket(又称套接字),包含进行网络通信必须的五种信息:
连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。建立socket
连接分成3个步骤:服务器监听,客户端请求,连接确认。
服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客
户端的连接请求。
客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先
描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一
个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式建立连接。而服务器端套
接字继续处于监听状态,继续接收其他客户端套接字的连接请求。
注意:socket不是协议
3.HTTP协议:超文本传输协议,是基于TCP/IP协议基础之上的应用层协议,主要解决如何包装数据,详细
规定了C与S之间的通信的规则。HTTP连接使用的是“请求—响应”的方式,不仅在请求时需要先建立连接,而且需要客
户端向服务器发出请求后,服务器端才能回复数据。很多情况下,需要服务器端主动向客户端推送数据,保持客户端与
服务器数据的实时与同步。此时若双方建立的是Socket连接,服务器就可以直接将数据传送给客户端;若双方建立的是
HTTP连接,则服务器需要等到客户端发送一次请求后才能将数据传回给客户端,因此,客户端定时向服务器端发送连
接请求,不仅可以保持在线,同时也是在“询问”服务器是否有新的数据,如果有就将数据传给客户端。
4.在开发即时通讯时可以选择使用第三方的IM服务(通讯量达到一定量要收费),也可以自己去实现。第三方服务商IM
底层协议基本上都是TCP。他们的IM方案很成熟,我们甚至不需要自己去搭建IM后台,什么都不需要去考虑。另一种是
自己去实现:1.基于Scoket原生:代表框架 CocoaAsyncSocket。2.基于WebScoket:代表框架 SocketRocket。3.基于
MQTT:代表框架 MQTTKit。4.基于XMPP:代表框架 XMPPFramework。
5.XMPP协议:XMPP是一个即时通讯的协议,它规范了用于即时通信在网络上数据传输格式的,比如登录,获取好友
列表等等的格式。XMPP在网络传输的数据是XML格式比如登录:把用户名和密码放在xml的标签中,传输到服务器。XMPP
是一个基于Socket通过的网络协议,目的是为了保存长连接,以实现即时通讯功能XMPP的客户端是使用一个XMPPFramework
框架实现XMPP的服务器是使用Openfire,一个开源的服务器客户端获取到服务器发送过来的好友消息,客户端需要
对XML进行解析,使用的解析框架的KissXML框架,而不是NSXMLParser/GDataXML。但是好像发送图片和语音文件时比较麻烦。
6.第三方IM比如环信:环信是一个即时通信的服务提供商环信使用的是XMPP协议,它是再XMPP的基础上进行二次开发,对服
务器Openfire和客户端进行功能模型的添加和客户端SDK的封装,环信的本质还是使用XMPP,基本于Socket的网络通信环信内部
实现了数据缓存,会把聊天记录添加到数据库,把附件(如音频文件,图片文件)下载到本地,使程序员更多时间是花到用户即时体
验上。环信内部已经实现了视频,音频,图片,其它附件发送功能,环信使用公司可以节约时间成本不需要公司内部搭建服务器客户
端的开发,使用环信SDK比使用XMPPFramework更简洁方便。