在 Windows 下的 socket 編程有兩個編程模型,阻塞和非阻塞。有時,他們也被叫作同步(阻 塞)和異步(非阻塞)。編程
在 Unix 中只支持阻塞模型。 服務器
實際上還 有些 其餘的 已經實 現的模 型。 包括完 成端口 (completion ports), 和重疊 I/O(overlapped I/O) 。然而使用這些模型要用明顯更多的代碼而且它們是特別爲高級服務器 應用保留的。
還有,這些模型不跨平臺而且在不一樣平臺的實現方式和實現程度不一樣。
Indy 10 包含對這些其餘模型的支持。網絡
阻塞
Indy 使用阻塞 socket 調用。阻塞調用很像一個文件的讀寫。當你讀數據或者寫數據時,直 到操做完成,函數纔會返回。不一樣的是,socket 中,操做可能會消耗更久由於數據可能不能 當即讀寫。一個讀或寫操做的速度沒法超過網絡或模型接收和傳輸數據的速度。 多線程
使用 Indy 時,鏈接一個接口只要簡單的調用 Connect 方法,而後等待它返回。若是 Connect 成功,它會在鏈接後返回。若是 Connect 方法失敗,它會引起相應的異常 app
非阻塞
非阻塞 socket 使用事件機制。調用被觸發後,當他們完成或者須要被注意時,引起事件。
好比,當嘗試鏈接一個 socket 時,你必須調用 Connect 方法。Connect 方法在 Socket 鏈接前 就當即會返回值。當 socket 鏈接上了,一個事件會發生。這要求通訊邏輯被分紅許多程序, 或者使用輪詢循環(polling loops)。 異步
阻塞的優勢
1. 易於編程 — 阻塞 socket 很易於編程。全部的用戶代碼都在一個地方,而且順序排列。
2. 跨平臺 — 因爲 Unix 使用阻塞 socket,便攜式代碼很好寫。Indy 依靠這個事實來實現 它的單源代碼跨平臺能力。其餘跨平臺的 socket 組件經過內部使用阻塞調用來模擬非 阻塞行爲。
3. 多線程工做良好 — 因爲阻塞 socket 的使用按照天然順序,他們是可繼承的封裝,因 此很適合多線程。
4. 不依賴消息 — 非阻塞 socket 依賴於 window 信息系統。當在多線程中使用時,分別的 信息序列要被建立。當不在多線程中使用時,處理多連接時很容易發生瓶頸狀況。 socket
阻塞的缺點
客戶端用戶界面"凍結" — 阻塞 socket 調用後直到完成任務纔會返回。當這調用發生在應用 的主線程中時,主線程沒法處理用戶界面消息。這致使用戶界面的"凍結"。凍結的發生是由 於直到阻塞 socket 調用返回控制應用程序的句柄前,更新,重繪和其餘消息都沒法被處理。 函數
非阻塞的優勢
1. 客戶端無用戶界面"凍結" — 由於用戶代碼響應事件,Windows 在 socket 事件間擁有 控制權。所以,Windows 也能夠答覆其餘 Windows 消息。
2. 能夠不用多線程的多任務 — 單線程能夠處理許多 socket。
3. 許多 socket 是輕量級的 — 由於許多 socket 能夠被處理而不須要多線程,內存和 CPU 的佔用一般不多。oop
非阻塞的缺點
編程更難 — 非阻塞要求使用輪詢或者事件。因爲輪詢很沒效率,事件更經常使用。使用事件要 求用戶代碼分紅許多子過程所以須要狀態追蹤。這致使代碼易於出 bug 而且難以維護。 線程