Socket

最近在接觸即時通訊相關的開發內容,撇除使用第三方服務的串接,

大多數都是建議使用 Socket 來和伺服器端進行連接和溝通。

而研究了一下,在 TCP / IP 架構下,sockets 可以分為兩種

  • Datagram sockets(connectionless)
  • Stream sockets(connection-oriented)

Datagram sockets(connectionless)

Datagram sockets 是使用 UDP 封包來進行傳送,

其主要的特色是速度快但不能保證資料的完整性以及次序有可能會有誤;

所以大多是使用在廣播資訊或是傳送一些較不是那麼重要的內容。

Stream sockets(connection-oriented)

而 Stream sockets 則是使用 TCP 封包來傳遞,

其因為會先需要確認 Server 和 Client 兩者連接狀態後再傳遞,

故速度較慢一些,但至少能確認資料的有序性以及完整度。

簡單的總結

以中華郵政的觀點來看,以結果來區分的話,

我們可以簡略地將 UDP 視為平信、TCP 視為掛號信。

而即時通訊的部分,依照上述的特色來看,就得選擇使用 TCP 的方式來進行溝通。

Server 和 Client 的溝通流程

首先,伺服器端和用戶端兩者必須使用同一類的封包才能互相通訊,

意思便是指 Server 建立了一個 UDP Socket,Client 也必須使用 UDP Socket 才能兩者打通。

而 Socket name 會需要包含 IP、Port、以及使用哪種協定;

當 Client 端的 Socket 成功聯繫上 Server 端的 Socket 時,

這兩者便形成一組 association。

iOS 上的 Socket 實作方式

我這邊是使用第三方套件的方式來協助實作,Github 上有不少相關的開源碼可以使用。

這篇就先以 CocoaAsyncSocket 作為內容主軸來當後面的說明。

比照上方的流程圖,首先我們要先建立一個 socket,再來進行 connect 的動作,

之後相關的 callback,會以 delegate 的方式來做處理。

不過這邊要比較注意到的是,會需要主動的執行 readData 的動作,

來告知底層,目前可以讀取傳輸進來的資料。

在 RxSwift 內的實作方式

讓 socket 的動作和事件是可被訂閱的,參考了一些實作的方式,

讓 CocoaAsyncSocket 和 RxSwift 結合在一塊:

有興趣的人可以參考參考!

七天學會設計模式 – Observe

訂閱

有使用過網誌或是一些新聞類型的網站時,通常可以在旁邊看到「訂閱」的按鈕,接著點擊下去後就可以在作者有發動或異動文章時,收到通知。

Observe

這個設計模式的概念類似於「訂閱」的功能,我們會去「訂閱」某個物件,當它做了某些事情或者其值改變時,可以去做相對應的動作。

應用

舉個比較常會遇到的案例:鍵盤

我們通常會希望在鍵盤升起來時,調整我們的畫面,看是移動 View 的 frame,或是設定 TableView 的 ContentOffset 之類的。

而大多數採取的方式是「監聽」 NotificationCenter 的「鍵盤升起」的事件,所以當「鍵盤升起」時,我們可以做相對應的處理;而當「鍵盤收起」時,我們也可以執行另一段 function。

這,便是 Observe 的設計模式。

我們去「訂閱」或者「監聽」某個事件,像是 Value changed 或是某個 function 被呼叫,來做相對應的處理。

第三方套件

RxSwiftReactiveCocoa 便都是圍繞在 Observe 設計模式的框架,來做響應式的開發。

響應式開發

如名稱所述,意思是指當 Model 或者 ViewModel 的狀態(值)更動時,畫面可以很即時地跟著變動。

對 RxSwift 有興趣的人,可以看看這篇文章 線上讀書會 RxSwift 影片分享