iOS IM開發準備工作(三)亂說Socket,iossocket
做IM的話,需要用的socket來通訊。如果你瞭解socket的話,可以不看這一篇,謹防被我帶坑。
至於什麼是socket,我就貼兩個連結,一個是部落格園的 http://www.cnblogs.com/dolphinX/p/3460545.html,一個是CSDN的http://blog.csdn.net/hguisu/article/details/7445768/。兩個連結講的都很好,不過部落格園的排版看起來舒服一些,而CSDN的有C的代碼可以參看。
一般情況下,我們做app的都是HTTP請求:你發送一個,伺服器給你回一個。直觀一點,從資料擷取的角度來說,socket可以被動的擷取 伺服器發送給你的資訊(不使用專業術語,可能不恰當,不過我要的效果是簡易說明。。。),也就是說,你不請求也能收到資料資訊。為了做到這樣的效果,你需要與伺服器保持一個長連結,就像打電話一樣。
雖然用打電話來舉例子不夠恰當,不過可以借鑒一下打電話時我們的行為,這些行為在socket通訊裡面都有相應的說法。
第一,打電話需要撥號。這和socket建立串連是一個道理,電話那頭有人接聽才算打通。也就是伺服器響應你了,才算串連上。
第二,打電話需要知道對方是誰。沒有來電顯示的時候,我們都要問一下,對方是誰;有來電顯示的時候,我們會知道對方的號碼。也就是我們需要確認,誰給我打的電話。socket也是一樣,想要做些事,你起碼要先登入吧。
第三,語音交談的時候。你是可以同時說話和接聽的。socket的話,也就是可以同時接受和發送。
第四,結束通話。這可能是很多原因,不過你會聽到掛斷的聲音;或者對方很久不講話,你自己掛電話。socket的話,可以主動斷開;如果你半天沒發訊息,伺服器就當你下線了,伺服器就和你就中斷連線。也就是說,需要一個心跳包。
當然,上面只是打電話。socket還是有些別的屬性。特別是資訊結構。
socket的通訊報文,一般分為兩段。一段叫做前序,一段就本文。
報文的前序,它裡面一般有以下資訊:操作的唯一指令 CMD,本文的長度 LENGTH,報文的認證資訊(一般自訂)。前序的長度一般固定,可能是唯一固定的了。CMD是用來說明,我這次發的資訊是幹嘛的;LENGTH是用來說,這次我帶了哪些資料;認證資訊,很重要,關係到安全。
報文的本文,就是這次要傳遞的有用資訊。按照CMD去解開就好了。
看到上面兩段,你就應該知道幾件事:
1、接受報文後,必須先解開報文的前序。如果這一步有異常,直接丟掉這段前序,去讀下一個前序。
2、本文的長度必須按照前序裡面的來截取。本文解開的結構需要對照CMD來處理。長度為0,需要處理;CMD不存在,需要處理。
有人會問iOS的 socket怎麼用啊。我想說,從建立串連到可以收發,第三方都幫你做了,你要做的就是區分前序和本文。