你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS Socket介紹及其簡單應用

iOS Socket介紹及其簡單應用

編輯:IOS開發綜合

socket,究竟是什麼東東,面試時,筆試有他,面試也有他,如果做智能硬件,肯定會用到socket,所以,今天帶大家回顧一下socket;

一、介紹:Socket:是應?層與TCP/IP協議族通信的中間軟件抽象層,它是一組接口。在設計模式中,Socket其實就是 一個門面模式,它把復雜的TCP/IP協議族隱藏在Socket接?後面;例:

 

你要打電話給?個朋友,先撥號,朋友聽到電話鈴聲後提起電話,這時你和你的朋友就建立起了連接,就可以講話了。等交流結束,掛斷電話結束此次交談。

 

建立連接步驟:先從服務器端說起。

1>服務器端先初始化Socket,然後與端?綁定(bind),對端?進?監聽(listen),調用accept阻塞,等待客戶端連接。

2>在這時如果有個客戶端初始化?個Socket,然後連接服務器(connect);

3>如果連接成功,這時客戶端與服務器端的連接就建?了。客戶端發送數據請求,服務器端接收請求並處理請求,然後連接成功,這時客戶端與服務器端的連接就建立了。客戶端發送數據請求,服務器端接收請求並處理請求,然後arc=send(fd,szText,cnt,0);把回應數據發送給客戶端,客戶端讀取數據,最後關閉連接,?次交互結束。簡而言之,在客戶端輸?服務器端的IP地址和發送的數據,然後按發送按鈕,服務器端接收到數據,然後回應客戶端。客戶端讀取回應的數據,顯?示在界?面上。在服務器端,主要是啟動Socket和監聽線程。服務器端?一直在監聽是否有客戶端連接,如有連接,處理客戶端的請求,給出回應,然後繼續監聽。

客戶端:蘋果iso開發: socket tcp/ip 的通訊,使用方法如下:

創建工程。把AsyncSocket添加到項目中。
添加CFNetwork.framework到工程中;
實現測試類:
#import

#import"AsyncSocket.h"

@interfaceiphone_socketViewController : UIViewController {

AsyncSocket *asyncSocket; }

@end

二、應用:

網絡上已經有編寫好的開源類庫GCDAsyncSocket和GCDAsyncUdpSocket ,這是GCD版的比AsyncSocket和AsyncUdpSocket估計要好用點,用法也很簡單,跟http很類似,只要指定服務器的ip和端口然後再實現各種回調就行,原生態實現正在摸索。。。。。socket默認情況下就是采用TCP協議,創建之後通信雙方的socket會一直保持連接,除非手動close或因為網絡原因close,所以,此種狀況對服務器而言是有一定資源消耗的,這種模式只適應與對服務器小規模的訪問,特別是對於實時性很高的應用,如視頻直播、呼叫系統等,而http一般都是短連接的,一次請求完之後客戶端便會於服務端端開連接。http是凌駕於socket之上的高級協議,而socket是比較底層的通訊方式,只是建立了一個連接通道,具體上面傳輸什麼樣的數據,按照什麼格式傳輸,需要你自己定義,所以這就需要重新編寫定義服務端與客戶端的所應遵循的規定,而http已經被前人們定義使用過了
先去github的網站下載最新的包,然後先看看介紹。網上很多都是老版本的帖子。官方已經推出了GCDAsyncSocket來代替以前老的AsyncSocket。我的項目是no-ARC的,這個框架只有arc的版本。所以引入GCDAsyncSocket的.h和.m文件後,修改xcode中項目的屬性,

步驟如下:

 

targets中“buildsettings”中找到Compilerforc/c++/Objective-c的選項。改為AppleLLVMcompiler3.0只要是3.0或以上就可以;在“buildphases”中“compilesources”中找到GCDAsyncSocket.m,增加參數-fobj-arc;
引入GCDAsyncSocket所需要的框架,CFNetwork和security這兩個框架;

 

三、通訊http,TCP/IP與socket之間的區別:

 

1、TCP/IP連接

手機能夠使用聯網功能是因為手機底層實現了TCP/IP協議,可以使手機終端通過無線網絡建立TCP連接。TCP協議可以對上層網絡提供接口,使上層網絡數據的傳輸建立在“無差別”的網絡之上。建立起一個TCP連接需要經過“三次握手”:

 

第一次握手:客戶端發送syn包(syn=j)到服務器,並進入SYN_SEND狀態,等待服務器確認;第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態;第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手。

 

握手過程中傳送的包裡不包含數據,三次握手完畢後,客戶端與服務器才正式開始傳送數據。理想狀態下,TCP連接一旦建立,在通信雙方中的任何一方主動關閉連接之前,TCP連接都將被一直保持下去。斷開連接時服務器和客戶端均可以主動發起斷開TCP連接的請求,斷開過程需要經過“四次握手”(過程就不細寫了,就是服務器和客戶端交互,最終確定斷開).

2、HTTP連接

HTTP協議即超文本傳送協議(HypertextTransferProtocol),是Web聯網的基礎,也是手機聯網常用的協議之一,HTTP協議是建立在TCP協議之上的一種應用。

HTTP連接最顯著的特點是客戶端發送的每次請求都需要服務器回送響應,在請求結束後,會主動釋放連接。從建立連接到關閉連接的過程稱為“一次連接”。

3.1套接字(socket)概念

套接字(socket)是通信的基石,是支持TCP/IP協議的網絡通信的基本操作單元。它是網絡通信過程中端點的抽象表示,包含進行網絡通信必須的五種信息:連接使用的協議,本地主機的IP地址,本地進程的協議端口,遠地主機的IP地址,遠地進程的協議端口。

3.2建立socket連接

建立Socket連接至少需要一對套接字,其中一個運行於客戶端,稱為ClientSocket,另一個運行於服務器端,稱為ServerSocket。

套接字之間的連接過程分為三個步驟:服務器監聽,客戶端請求,連接確認。

服務器監聽:服務器端套接字並不定位具體的客戶端套接字,而是處於等待連接的狀態,實時監控網絡狀態,等待客戶端的連接請求。

客戶端請求:指客戶端的套接字提出連接請求,要連接的目標是服務器端的套接字。為此,客戶端的套接字必須首先描述它要連接的服務器的套接字,指出服務器端套接字的地址和端口號,然後就向服務器端套接字提出連接請求。

連接確認:當服務器端套接字監聽到或者說接收到客戶端套接字的連接請求時,就響應客戶端套接字的請求,建立一個新的線程,把服務器端套接字的描述發給客戶端,一旦客戶端確認了此描述,雙方就正式建立連接。而服務器端套接字繼續處於監聽狀態,繼續接收其他客戶端套接字的連接請求。

4、SOCKET連接與TCP/IP連接

創建Socket連接時,可以指定使用的傳輸層協議,Socket可以支持不同的傳輸層協議(TCP或UDP),當使用TCP協議進行連接時,該Socket連接就是一個TCP連接。

?5、Socket連接與HTTP連接

很多情況下,需要服務器端主動向客戶端推送數據,保持客戶端與服務器數據的實時與同步。此時若雙方建立的是Socket連接,服務器就可以直接將數據傳送給客戶端;若雙方建立的是HTTP連接,則服務器需要等到客戶端發送一次請求後才能將數據傳回給客戶端,因此,客戶端定時向服務器端發送連接請求,不僅可以保持在線,同時也是在“詢問”服務器是否有新的數據,如果有就將數據傳給客戶端。

6、http協議是應用層的協義:

一個是發動機(Socket),提供了網絡通信的能力 ,一個是轎車(Http),提供了具體的方式 ;兩個計算機之間的交流無非是兩個端口之間的數據通信,具體的數據會以什麼樣的形式展現`是以不同的應用層協議來定義的`如HTTP`FTP`...??socket是對端口通信開發的工具,它要更底層一些 .

7、網絡請求方式:get和post這是http協議的兩種方法,另外還有head,delete等這兩種方法有本質的區別,get只有一個流,參數附加在url後,大小個數有嚴格限制且只能是字符串。post的參數是通過另外的流傳遞的,不通過url,所以可以很大,也可以傳遞二進制數據,如文件的上傳。在servlet開發中,

 

補充說明:TCP/IP、Http、Socket的區別

通過初步的了解,知道IP協議對應於網絡層,TCP協議對應於傳輸層,而HTTP協議對應於應用層,而我們平時說的最多的socket是什麼呢,實際上socket是對TCP/IP協議的封裝,Socket本身並不是協議,而是一個調用接口(API)。通過Socket,我們才能使用TCP/IP協議。實際上,Socket跟TCP/IP協議沒有必然的聯系。Socket編程接口在設計的時候,就希望也能適應其他的網絡協議。所以說,Socket的出現只是使得程序員更方便地使用TCP/IP協議棧而已,是對TCP/IP協議的抽象,從而形成了我們知道的一些最基本的函數接口,比如create、listen、connect、accept、send、read和write等等。網絡有一段關於socket和TCP/IP協議關系的說法比較容易理解:“TCP/IP只是一個協議棧,就像操作系統的運行機制一樣,必須要具體實現,同時還要提供對外的操作接口。實際上,傳輸層的TCP是基於網絡層的IP協議的,而應用層的HTTP協議又是基於傳輸層的TCP協議的,而Socket本身不算是協議,就像上面所說,它只是提供了一個針對TCP或套接字之間的連接過程分為三個步驟:服務器監聽,客戶端請求,連接確認。

 

服務器監聽:服務器端套接字並不定位具體的客戶端套接字,而是處於等待連接的狀態,實時監控網絡狀態,等待客戶端的連接請求。客戶端請求:指客戶端的套接字提出連接請求,要連接的目標是服務器端的套接字。為此,客戶端的套接字必須首先描述它要連接的服務器的套接字,指出服務器端套接字的地址和端口號,然後就向服務器端套接字提出連接請求。
連接確認:當服務器端套接字監聽到或者說接收到客戶端套接字的連接請求時,就響應客戶端套接字的請求,建立一個新的線程,把服務器端套接字的描述發給客戶端,一旦客戶端確認了此描述,雙方就正式建立連接。

 

而服務器端套接字繼續處於監聽狀態,繼續接收其他客戶端套接字的連接請求。

三、HTTP鏈接的特點

HTTP協議即超文本傳送協議(HypertextTransfer Protocol ),是Web聯

四、TCP和UDP的區別(考得最多。。快被考爛了我覺得- -\\)

1、TCP是面向鏈接的,雖然說網絡的不安全不穩定特性決定了多少次握手都不能保證連接的可靠性,但TCP的三次握手在最低限度上(實際上也很大程度上保證了)保證了連接的可靠性;

而UDP不是面向連接的,UDP傳送數據前並不與對方建立連接,對接收到的數據也不發送確認信號,發送端不知道數據是否會正確接收,當然也不用重發,所以說UDP是無連接的、不可靠的一種數據傳輸協議。

2、也正由於1所說的特點,使得UDP的開銷更小數據傳輸速率更高,因為不必進行收發數據的確認,所以UDP的實時性更好。知道了TCP和UDP的區別,就不難理解為何采用TCP傳輸協議的MSN比采用UDP的QQ傳輸文件慢了,但並不能說QQ的通信是不安全的,因為程序員可以手動對UDP的數據收發進行驗證,比如發送方對每個數據包進行編號然後由接收方進行驗證啊什麼的,即使是這樣,UDP因為在底層協議的封裝上沒有采用類似TCP的“三次握手”而實現了TCP所無法達到的傳輸效率。

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved