即时通讯

  • Post author:
  • Post category:其他

即时通讯:

一:使用第三方的即时通讯,底层协议都是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

 


版权声明:本文为u011518806原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。