先了解一些基本概念————
<h5>Socket</h5>
- Socket又稱“套接字”
- 網(wǎng)絡(luò)上的兩個程序通過一個
雙向的通信連接實現(xiàn)數(shù)據(jù)的交換
袒啼,這個鏈接的一端成為socket
-
應(yīng)用程序通常通過“套接字”向網(wǎng)絡(luò)發(fā)出請求或者應(yīng)答網(wǎng)絡(luò)請求
Socket.png
<h5>網(wǎng)絡(luò)通信的要素</h5>
- 網(wǎng)絡(luò)上的請求就是通過Socket來建立鏈接然后互相通信
- IP地址(網(wǎng)絡(luò)上主機設(shè)備的唯一標識)
- 端口號(定位程序)
- 用于標示進程的邏輯地址饥侵,不同進程的表示
- 有效端口:0~65535卧惜,其中
0~1024由系統(tǒng)使用
或者保留端口心褐,開發(fā)中建議使用1024以上的端口
-
傳輸協(xié)議
(用什么樣的方式進行交互)- 通訊的規(guī)則
- 常見協(xié)議:TCP肆糕、UDP
<h5>TCP&UDP</h5>
- TCP(傳輸控制協(xié)議)
- 建立
連接
藻懒,形成傳輸數(shù)據(jù)的通道 - 在連接中進行大數(shù)據(jù)傳輸(數(shù)據(jù)大小不受限制)
- 通過三次握手完成連接却邓,
是可靠協(xié)議镀琉,安全送達
- 必須建立連接峦嗤,效率會稍低
- 建立
- UDP(用戶數(shù)據(jù)報協(xié)議)
- 將數(shù)據(jù)及
源和目的
封裝成數(shù)據(jù)包中,不需要建立連接 - 每個數(shù)據(jù)報的的大小限制在64k之內(nèi)
- 因為無需連接屋摔,因此是不可靠協(xié)議
- 不需要建立連接烁设,速度快
- 將數(shù)據(jù)及
<h5>Socket通信流程圖</h5>
Socket通信流程圖.png
<h5>實現(xiàn)Socket服務(wù)端監(jiān)聽</h5>
- 實現(xiàn)socket監(jiān)聽的方法
- 使用C語言實現(xiàn)
- 使用CocoaAsyncSocket第三方框剪,內(nèi)部是對C的封裝
- Telnet命令
telnet host port/telnet 192.168.10.10 5288
- telnet命令是連接服務(wù)器上的某個端口對應(yīng)的服務(wù)
<h5>Socket層上的協(xié)議</h5>
- Socket層上的協(xié)議指的數(shù)據(jù)傳輸?shù)母袷?/li>
- HTTP協(xié)議:
傳輸格式:假設(shè)钓试;這是個假設(shè)装黑,實際http的格式不是這樣的
http1.1,`content-type`:multipart/form-data,`content-length`:188,body:username=zhangsan&password=123456
- XMPP協(xié)議,是一款即時通訊協(xié)議
可擴展消息處理現(xiàn)場協(xié)議弓熏,是基于可擴展標記語言(XML)的協(xié)議曹体,它用于即時消息(IM)以及在線現(xiàn)場探測。這個協(xié)議可能最終允許可能最終允許因特網(wǎng)用戶向因特網(wǎng)上的其他任何人發(fā)送即時消息
傳輸格式:
<from>Vincent</from>
<to>Eli</to>
<body>一起吃飯</body>
- 自定義即時通訊協(xié)議:JSON格式
{
"from" : "Vincent",
"to" : "Eli",
"body" : "中午一起吃飯"
}
><h5>即時通許</h5>
- 即時通許硝烂,又稱實時通訊
- 即時通訊(Instant Messaging箕别,簡稱IM)是一個`實時通信`系統(tǒng),允許兩人或多人使用網(wǎng)絡(luò)實時的傳遞文字信息滞谢、文件串稀、語言與視頻交流
- 即時通訊在開發(fā)中使用的場景
- 開發(fā)一個類似于微信,QQ的聊天軟件
- 在電商APP集成買家與賣家的實時溝通等
- 當前時下狮杨,實現(xiàn)即時通許的方案
- XMPP
- `環(huán)信` 就是在xmppframework+openfire的基礎(chǔ)上進行的二次開發(fā)
- `親加母截、融云、網(wǎng)易云橄教、友盟… …`
><h5>XMPP</h5>
- XMPP: The Extensible Messaging and Presence Protocol(可擴展通訊和表示協(xié)議)
- XMPP是一種基于`XML(可擴展標記語言)的即時通訊協(xié)議`清寇,XMPP的官方文檔是RFC 3920
- 這個文檔定義了登錄,退出护蝶,獲取好友华烟,發(fā)送消息等等的`XML數(shù)據(jù)傳輸協(xié)議`
- XMPP是一個典型的`C/S`框架,基本的網(wǎng)絡(luò)形式是`客戶端通過TCP/IP連接到服務(wù)器`持灰,通過Socket建立連接盔夜,然后再之上傳輸XML流
- XMPP是一種類似于HTTP協(xié)議的一種`數(shù)據(jù)傳輸協(xié)議`,其過程就如同“解包裝-->包裝”的過程,只需要理解其接收的類型及返回的類型喂链,便可以很好的利用XMPP來進行數(shù)據(jù)通訊
- XMPP官方網(wǎng)站——http://xmpp.org
><h5>XMPP實現(xiàn)即時通信的準備工作</h5>
- 下載Openfire服務(wù)器
- 下載XMPPFrameWork框架
![XMPP實現(xiàn)即時通信的準備工作.png](http://upload-images.jianshu.io/upload_images/3960806-d2aaa1072ccdc09e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
><h5>`面試題:是否使用過XMPP返十,XMPP的實現(xiàn)原理`</h5>
- XMPP是一個即時通訊的協(xié)議,`它定義好用于即時通訊在網(wǎng)絡(luò)上數(shù)據(jù)傳輸?shù)母袷絗比如登陸椭微,獲取好友列表等等的格式洞坑。XMPP在網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)是`XML格式`
- 比如登錄:吧用戶名和密碼放在xml的標簽中,傳輸給服務(wù)器
- XMPP是一個基于Socket通訊的網(wǎng)絡(luò)協(xié)議蝇率,目的是為了保存長連接检诗,以實現(xiàn)即時通訊功能
- XMPP的客戶端是使用一個XMPPFramework框架
- XMPP的服務(wù)器是使用Openfire,一個開源的服務(wù)器
- 假設(shè)客戶端獲取到服務(wù)器發(fā)送過來的好友消息瓢剿,客戶端需要對XML進行解析,使用的解析框架是KissXML框架
><h5>`面試題:在使用XML的時候有沒有遇到什么困難`</h5>
- <b>發(fā)送附件(圖片悠轩,語音间狂,文檔...)時比較麻煩</b>
- XMPP框架沒有提供附件傳送的功能,需要自己實現(xiàn)
- 實現(xiàn)方法火架,把文件上傳到文件服務(wù)器鉴象,上傳成功后獲取文件保存路徑,再把附件的路徑發(fā)送給好友
><h5>`面試題:是否使用過環(huán)信何鸡,簡單的說下環(huán)信的實現(xiàn)原理`</h5>
- 環(huán)信是一個即時通訊服務(wù)提供商
- 環(huán)信使用的是XMPP協(xié)議纺弊,它是在XMPP的基礎(chǔ)上進行二次開發(fā),對服務(wù)器Openfire和客戶端進行`功能模型的添加`和`客戶端SDK的封裝`骡男,環(huán)信的本質(zhì)還是使用XMPP淆游,基于Socket的網(wǎng)絡(luò)通訊
- 環(huán)信內(nèi)部實現(xiàn)了`數(shù)據(jù)緩存`,會把聊天記錄添加到數(shù)據(jù)庫隔盛,把附件下載到本地犹菱,程序猿更多時間是花到`界面用戶體驗上`
- 環(huán)信內(nèi)部已經(jīng)實現(xiàn)了視頻,音頻吮炕,圖片腊脱,其他附件發(fā)送功能
- 使用環(huán)信可以節(jié)約時間成本
- 不需要公司內(nèi)部搭建服務(wù)器
- 客戶端的開發(fā),使用環(huán)信SDK比使用XMPPFramework更簡潔方便