即时通讯:
一:使用第三方的即时通讯,底层协议都是tcp,(qq为udp协议)
二:自己写比如socket,webscoket。MQTT XMPP。
1:如果自己写的话 首先要考虑的就是通讯协议,tcp or udp。
http://baike.baidu.com/link?url=Dtddxdf5GQVYDgaS4bBJLVa016rGGhxzbWYrdeEiQkpGR_Wwde3-kAMKHrtWev9LiBehBdQHS-kiHXSwmCLWirkgQgQL2ul7RdLVkOneQ5DsnKnaf9888yZ5JMmC2Hkj (对于我们不熟悉的协议建议英文好的先去看官方,不然就是百度百科,客观公正,然后再去看别人的博客加强理解)
总结出来就是(根据团队技术及项目需求来决定 使用哪种协议)
1.TCP是面向连接的可靠的传输控制协议,UDP是面向非连接的用户数据报协议.
2.TCP(三次握手保证相对可靠性)可传大量数据,速度相对比较慢,UDP一次性传输少量对可靠性要求不高的数据,速度比较快
3.tcp一般用于音频、视频等数据的传输,对于资源能耗比较小,对可靠性要求不高,即使丢失一两条数据也不会产生太大影响的通常是udp。(这是TCP/UDP区别和联系)。
使用tcp协议之前 我们要考虑的就是 三次握手 四次挥手,
握手:
1:client——————–> server。(目的在于 : 我想去找你玩)
2:server———————-> client.(服务器端收到消息之后,回一句:好呀,那你来吧)。(此时服务器处于半链接状态)
3:clinet———————->server (告诉服务器 ,嗯 我过来了)。
挥手:(四次挥手的目的主要是为了 彻底断开链接)。
1:client———————-> server。(我没有事了。主要目的在于关闭client 端和服务器端的数据传输 client端进入FIN_WAIT_1状态)
2:server———————-> client。(服务器收到fin之后给client端回一个 即fin+1 (表示自己收到了)同时Server进入CLOSE_WAIT状态)
3:server———————-> client。 (server发送一个fin 来关闭server与 client 间的数据传输,Server进入LAST_ACK状态。)
4:client———————-> server 。(Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。)
1: socket :(很多公司的首先)代表框架CocoaAsyncSocket 1:GCDAsyncSocket (http://www.jianshu.com/p/388357db404c )2:GCDAsyncUdpSocket
socket是套接字 不是协议
– (void)sendMSG:(NSString*)p_MSG type:(int)p_type fromID:(NSString*)p_fromID fromName:(NSString*)p_fromName fromIcon:(NSString*)p_fromIcon toID:(NSString*)p_toID sponseID:(NSString*)p_sponseID participator_ids:(NSString*)p_participator_ids questionID:(NSString*)p_questionID messageID:(NSString*)p_messageID messagePlus:(NSString*)p_messagePlus isShow:(BOOL) isShow(这个内容按照项目需求 跟服务器定义)
NSString * content = [NSString stringWithFormat:
@”{\”dt\”:\”%@\”,\”pt\”:\”%@\”,\”fi\”:\”%@\”,\”n\”:\”%@\”,\”ic\”:\”%@\”,\”ti\”:\”%@\”,\”si\”:\”%@\”,\”pi\”:\”%@\”,\”qi\”:\”%@\”,\”mi\”:\”%@\”,\”mp\”:\”%@\”,\”m\”:\”%@\”,\”ol\”:\”%@\”}%@”,
device_type,proto_type,fromID,fromName,fromIcon,toID,sponseID,participator_ids,
questionID,messageID,messagePlus,msg,isReturnOnline,paramEnd ];
if (LOG_TEST_SOCKET) {
NSLog(@”[%d]sendMsg :%@”,__LINE__,content);
}
NSData *data = [content dataUsingEncoding:NSUTF8StringEncoding];
[self sendData:data];
– (void) sendData:(NSData *)data{
NSTimeInterval current_time = [[NSDate date] timeIntervalSince1970];
if (current_time – self.lastSendTime > 60/*秒*/*1*1) {
if (LOG_TEST_SOCKET) {
NSLog(@”time interval is too long, —-xxxxxxxx re-connect— [%d]”,__LINE__);
}
[self setAsyncSocketInvalid];
[self sendConnect];
}
self.lastSendTime = current_time ;
[self.client writeData:data withTimeout:-1 tag:0]; // 发送即时消息
[self.client readDataWithTimeout:-1 tag:0];
}
定时发送心跳包 表示此人还存活状态,(在建立项目前先定义好相关信息 如下:)
考虑数据格式(json xml) 编码格式(utf-8)
数据的拆包粘包(tcp的通讯协议支持 传输大数据 此时为了传输需要tcp分为多个包传输,但是在最后的时候并不能保证每个包都是按照顺序传输过来的,比如data2 。data1的形式)。
TCP粘包和拆包产生的原因(参考链接: http://blog.csdn.net/huaishu/article/details/50041169 )
1. 应用程序写入数据的字节大小大于套接字发送缓冲区的大小
3. 以太网的payload大于MTU进行IP分片。MTU指:一种通信协议的某一层上面所能通过的最大数据包大小。如果IP层有一个数据包要传,而且数据的长度比链路层的MTU大,那么IP层就会进行分片,把数据包分成若干片,让每一片都不超过MTU。注意,IP分片可以发生在原始发送端主机上,也可以发生在中间路由器上。
TCP粘包和拆包的解决策略
1. 消息定长。例如100字节。
2. 在包尾部增加回车或者空格符等特殊字符进行分割,典型的如FTP协议
3. 将消息分为消息头和消息尾。
4. 其它复杂的协议,如RTMP协议等。
这是一个拆包粘包过程:
2: websocket:结合hppt来看,表明 我使用的对象是websocket,版本号 等等, 代表框架 SocketRocket (结合http1.0 到1.1来看。)
基本配置信息:
它是一个双向链接:
3: xmpp(可扩展协议) :(争议比较大),代表框架 XMPPFramework 为聊天协议
http://blog.csdn.net/wang631106979/article/details/52557265
(链接:http://eee87353.wiz01.com/share/s/3KW7dj0nd4Wq26_E963GUmf51Dh8pq0sRkCF2GlHNn0ciNDq 密码:7hg1
链接:http://eee87353.wiz01.com/share/s/3KW7dj0nd4Wq26_E963GUmf52l38aC1dckpA2FnusZ1eXoj6
密码:45up
这个是我之前收藏的笔记)
基本配置信息, 就像是我们在使用第三方的时候 通常会写appkey及appid 一个道理,紧接着就是 它的协议方法,:
创建一个xmppstram,并且激活它,
4: 基于MQTT:代表框架 MQTTKit。(也属于即时通讯框架,但是没有使用过)。
第三方的通讯协议:根据市场上很多 融云 环信等
使用第三方的 不建议采用pod形式安装, 原因在于(不一定安装成功,且官方最后也会建议你手动安装, 比如环信和LeanCloud)。(https://github.com/xhzengAIB/MessageDisplayKit 这是最先开始曾宪华做开源的时候用的)。
叫两家目前使用情况而言leancloud比较看好,但是从李智维离开之后,跟新较少。目前由 陈宜龙负责。
这个是 lencloud 进入聊天页面的一种方式。
这个是环信(用的时候要先集成他们的ui)
环信是很多企业的选择。
都提供了ui来供使用,
为了方便修改,建议在使用的时候,先建立公共类 来使用。短期项目建议使用官方ui, 但是不利于修改,特别是与leancloud的而言,技术团队人员较少。也没有客服。
如果使用pod的情况下 ,你会发现他并不一定能成功,即使在运行的时候 没有报错 ,但是在掉用的时候 你会发现找不到相对应的文件,
第二;手动添加他的sdk
第三继承他的easeui 的情况下,请先参考 他的 第三方库 与 自己的是否冲突,如果有重复 先删除在添加到项目中,
第四; 他的demo用 关于一些公共方法时候 是在mainvc中,并没有 在真正意义上玻璃开来, 所以 如果要使用的话 请先建立一个dmeo 如果能成功的话 在移植到项目中,我这边因为项目任务紧 所以我直接放到项目中,然后我发现 我用了双倍的时间来处理冲突问题,
第五关于证书, 消息推送 程序进入后台 3分钟之内,采用的是本地推送, 超过3分钟 使用的apns
继承easeui 直接 建立一个chatvc 继承messagevc
以上所有 在使用的时候 建议先建立demo。
1: 使用第三方的时候 ,建议注册放在服务器端,登录我们自己的服务器拿到相关信息之后再去登录第三方平台。
2: 推出的时候 先推出第三方 在推出我们自己的。
在结尾给大家分享一个好的链接http://www.jianshu.com/p/2dbb360886a8