日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

即时通讯

發(fā)布時(shí)間:2023/12/9 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 即时通讯 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

即時(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é)

以上是生活随笔為你收集整理的即时通讯的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。