即时通讯
即時(shí)通訊:
一:使用第三方的即時(shí)通訊,底層協(xié)議都是tcp,(qq為udp協(xié)議)
二:自己寫(xiě)比如socket,webscoket。MQTT ? XMPP。
? 1:如果自己寫(xiě)的話 首先要考慮的就是通訊協(xié)議,tcp or udp。
???http://baike.baidu.com/link?url=Dtddxdf5GQVYDgaS4bBJLVa016rGGhxzbWYrdeEiQkpGR_Wwde3-kAMKHrtWev9LiBehBdQHS-kiHXSwmCLWirkgQgQL2ul7RdLVkOneQ5DsnKnaf9888yZ5JMmC2Hkj??(對(duì)于我們不熟悉的協(xié)議建議英文好的先去看官方,不然就是百度百科,客觀公正,然后再去看別人的博客加強(qiáng)理解)
?
? ?總結(jié)出來(lái)就是(根據(jù)團(tuán)隊(duì)技術(shù)及項(xiàng)目需求來(lái)決定 使用哪種協(xié)議)
?
? ?1.TCP是面向連接的可靠的傳輸控制協(xié)議,UDP是面向非連接的用戶數(shù)據(jù)報(bào)協(xié)議.?
? ?2.TCP(三次握手保證相對(duì)可靠性)可傳大量數(shù)據(jù),速度相對(duì)比較慢,UDP一次性傳輸少量對(duì)可靠性要求不高的數(shù)據(jù),速度比較快?
? ?3.tcp一般用于音頻、視頻等數(shù)據(jù)的傳輸,對(duì)于資源能耗比較小,對(duì)可靠性要求不高,即使丟失一兩條數(shù)據(jù)也不會(huì)產(chǎn)生太大影響的通常是udp。(這是TCP/UDP區(qū)別和聯(lián)系)。
?
使用tcp協(xié)議之前 我們要考慮的就是 三次握手 四次揮手,
? 握手:
? ? ?1:client--------------------> server。(目的在于 : 我想去找你玩)
? ? ?2:server----------------------> client.(服務(wù)器端收到消息之后,回一句:好呀,那你來(lái)吧)。(此時(shí)服務(wù)器處于半鏈接狀態(tài))
? ? ?3:clinet---------------------->server (告訴服務(wù)器 ,嗯 我過(guò)來(lái)了)。
?
? 揮手:(四次揮手的目的主要是為了 徹底斷開(kāi)鏈接)。
? ? ?1:client----------------------> server。(我沒(méi)有事了。主要目的在于關(guān)閉client 端和服務(wù)器端的數(shù)據(jù)傳輸 client端進(jìn)入FIN_WAIT_1狀態(tài))
? ? ?2:server----------------------> client。(服務(wù)器收到fin之后給client端回一個(gè) 即fin+1 (表示自己收到了)同時(shí)Server進(jìn)入CLOSE_WAIT狀態(tài))
? ? ?3:server----------------------> client。 (server發(fā)送一個(gè)fin 來(lái)關(guān)閉server與 client 間的數(shù)據(jù)傳輸,Server進(jìn)入LAST_ACK狀態(tài)。)
? ? ?4:client----------------------> server 。(Client收到FIN后,Client進(jìn)入TIME_WAIT狀態(tài),接著發(fā)送一個(gè)ACK給Server,確認(rèn)序號(hào)為收到序號(hào)+1,Server進(jìn)入CLOSED狀態(tài),完成四次揮手。)
?
?
?
?
1: socket :(很多公司的首先)代表框架CocoaAsyncSocket ?1:GCDAsyncSocket (http://www.jianshu.com/p/388357db404c??)2:GCDAsyncUdpSocket
?
?
?
socket是套接字 不是協(xié)議
- (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(這個(gè)內(nèi)容按照項(xiàng)目需求 跟服務(wù)器定義)
?
?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];??//?發(fā)送即時(shí)消息
?? ?
? ? [self.client?readDataWithTimeout:-1?tag:0];
?? ?
}
?
? ?定時(shí)發(fā)送心跳包 表示此人還存活狀態(tài),(在建立項(xiàng)目前先定義好相關(guān)信息 ? 如下:)
? ?考慮數(shù)據(jù)格式(json xml) ?編碼格式(utf-8)
? ?數(shù)據(jù)的拆包粘包(tcp的通訊協(xié)議支持 傳輸大數(shù)據(jù) 此時(shí)為了傳輸需要tcp分為多個(gè)包傳輸,但是在最后的時(shí)候并不能保證每個(gè)包都是按照順序傳輸過(guò)來(lái)的,比如data2 ?。data1的形式)。
?
? ?TCP粘包和拆包產(chǎn)生的原因(參考鏈接:? http://blog.csdn.net/huaishu/article/details/50041169? )
? ? 1. 應(yīng)用程序?qū)懭霐?shù)據(jù)的字節(jié)大小大于套接字發(fā)送緩沖區(qū)的大小
? ? ?3. 以太網(wǎng)的payload大于MTU進(jìn)行IP分片。MTU指:一種通信協(xié)議的某一層上面所能通過(guò)的最大數(shù)據(jù)包大小。如果IP層有一個(gè)數(shù)據(jù)包要傳,而且數(shù)據(jù)的長(zhǎng)度比鏈路層的MTU大,那么IP層就會(huì)進(jìn)行分片,把數(shù)據(jù)包分成若干片,讓每一片都不超過(guò)MTU。注意,IP分片可以發(fā)生在原始發(fā)送端主機(jī)上,也可以發(fā)生在中間路由器上。
?
? ?TCP粘包和拆包的解決策略
? ? ?1. 消息定長(zhǎng)。例如100字節(jié)。
? ? ?2. 在包尾部增加回車或者空格符等特殊字符進(jìn)行分割,典型的如FTP協(xié)議
? ? ?3. 將消息分為消息頭和消息尾。
? ? ?4. 其它復(fù)雜的協(xié)議,如RTMP協(xié)議等。
?
這是一個(gè)拆包粘包過(guò)程:
?
?
2: websocket:結(jié)合hppt來(lái)看,表明 我使用的對(duì)象是websocket,版本號(hào) 等等, 代表框架 SocketRocket (結(jié)合http1.0 到1.1來(lái)看。)
?
基本配置信息:
?
?
?
它是一個(gè)雙向鏈接:
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
3: xmpp(可擴(kuò)展協(xié)議) :(爭(zhēng)議比較大),代表框架 XMPPFramework 為聊天協(xié)議 ?
????
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
?
?這個(gè)是我之前收藏的筆記)
?
? 基本配置信息, 就像是我們?cè)谑褂玫谌降臅r(shí)候 通常會(huì)寫(xiě)appkey及appid 一個(gè)道理,緊接著就是 它的協(xié)議方法,:
?
創(chuàng)建一個(gè)xmppstram,并且激活它,
?
?
?
?
?
?
4: 基于MQTT:代表框架 MQTTKit。(也屬于即時(shí)通訊框架,但是沒(méi)有使用過(guò))。
?
?
第三方的通訊協(xié)議:根據(jù)市場(chǎng)上很多 融云 環(huán)信等
?使用第三方的 不建議采用pod形式安裝, 原因在于(不一定安裝成功,且官方最后也會(huì)建議你手動(dòng)安裝, 比如環(huán)信和LeanCloud)。(https://github.com/xhzengAIB/MessageDisplayKit??? 這是最先開(kāi)始曾憲華做開(kāi)源的時(shí)候用的)。
?叫兩家目前使用情況而言leancloud比較看好,但是從李智維離開(kāi)之后,跟新較少。目前由 陳宜龍負(fù)責(zé)。
這個(gè)是 lencloud 進(jìn)入聊天頁(yè)面的一種方式。
?
?
?
這個(gè)是環(huán)信(用的時(shí)候要先集成他們的ui)
?
?環(huán)信是很多企業(yè)的選擇。
?
?都提供了ui來(lái)供使用,
?為了方便修改,建議在使用的時(shí)候,先建立公共類 來(lái)使用。短期項(xiàng)目建議使用官方ui, 但是不利于修改,特別是與leancloud的而言,技術(shù)團(tuán)隊(duì)人員較少。也沒(méi)有客服。
?
?
?
?
?
?
?
如果使用pod的情況下 ,你會(huì)發(fā)現(xiàn)他并不一定能成功,即使在運(yùn)行的時(shí)候 沒(méi)有報(bào)錯(cuò) ,但是在掉用的時(shí)候 你會(huì)發(fā)現(xiàn)找不到相對(duì)應(yīng)的文件,
第二;手動(dòng)添加他的sdk
第三繼承他的easeui 的情況下,請(qǐng)先參考 他的 第三方庫(kù) 與 自己的是否沖突,如果有重復(fù) 先刪除在添加到項(xiàng)目中,?
第四; 他的demo用 關(guān)于一些公共方法時(shí)候 是在mainvc中,并沒(méi)有 在真正意義上玻璃開(kāi)來(lái), 所以 如果要使用的話 請(qǐng)先建立一個(gè)dmeo ?如果能成功的話 在移植到項(xiàng)目中,我這邊因?yàn)轫?xiàng)目任務(wù)緊 所以我直接放到項(xiàng)目中,然后我發(fā)現(xiàn) 我用了雙倍的時(shí)間來(lái)處理沖突問(wèn)題,
第五關(guān)于證書(shū), 消息推送 程序進(jìn)入后臺(tái) 3分鐘之內(nèi),采用的是本地推送, 超過(guò)3分鐘 使用的apns ?
繼承easeui ?直接 建立一個(gè)chatvc 繼承messagevc
?
?
?
以上所有 在使用的時(shí)候 建議先建立demo。
1: 使用第三方的時(shí)候 ,建議注冊(cè)放在服務(wù)器端,登錄我們自己的服務(wù)器拿到相關(guān)信息之后再去登錄第三方平臺(tái)。
2: 推出的時(shí)候 先推出第三方 在推出我們自己的。
?
?
在結(jié)尾給大家分享一個(gè)好的鏈接http://www.jianshu.com/p/2dbb360886a8
?
總結(jié)
- 上一篇: [html] 本地存储和cookie之
- 下一篇: java udp server_实现ja