iOS ***各種網絡編程面試總結****


#########################################################

進程與線程

進程和線程都是由操作系統分配和調度的程序運行的基本單元,系統利用該基本單元實現系統對應用的並發性。

進程是一塊包含了某些資源的內存區域。操作系統利用進程把它的工作划分為一些功能單元。進程中所包含的一個或多個執行單元稱為線程(thread)。進程還擁有一個私有的虛擬地址空間,該空間僅能被它所包含的線程訪問。


線程是進程的一個實體,CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.線程自己基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(堆棧和局部變量),但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源.
一個線程可以創建和撤銷另一個線程;同一個進程中的多個線程之間可以並發執行. 

 

#########################################################

多線程

多線程編程是防止主線程堵塞,增加運行效率等等的最佳方法。而原始的多線程方法存在很多的毛病,包括線程鎖死等。在Cocoa中,Apple提供了NSOperation這個類,提供了一個優秀的多線程編程方法。

本次介紹NSOperation的子集,簡易方法的NSInvocationOperation

 

一個NSOperationQueue 操作隊列,就相當於一個線程管理器,而非一個線程。因為你可以設置這個線程管理器內可以並行運行的的線程數量等等

 

多線程

NSInvocationOperation *op1=[[NSInvocationOperationalloc]initWithTarget:selfselector:@selector(imageloadWithstr:) object:@"1"];

    NSInvocationOperation *op2=[[NSInvocationOperationalloc]initWithTarget:selfselector:@selector(imageloadWithstr:) object:@"2"];

    NSInvocationOperation *op3=[[NSInvocationOperationalloc]initWithTarget:selfselector:@selector(imageloadWithstr:) object:@"3"];

    NSInvocationOperation *op4=[[NSInvocationOperationalloc]initWithTarget:selfselector:@selector(imageloadWithstr:) object:@"4"];

    NSOperationQueue *queue=[[NSOperationQueuealloc]init];

    [queue setMaxConcurrentOperationCount:1];

    [queue addOperation:op4];

    [queue addOperation:op1];

    [queue addOperation:op2];

    [queue addOperation:op3];

-(void)imageloadWithstr:(NSString*)str{

    if ([str isEqualToString:@"1"]) {

        NSLog(@"%@",str);

        NSURL *url=[NSURLURLWithString:@"http://t3.baidu.com/it/u=3552717391,440053905&fm=25&gp=0.jpg"];

        NSData *data=[NSDatadataWithContentsOfURL:url];

        self.image.image=[UIImageimageWithData:data];

    }

    if([str isEqualToString:@"2"]){

        NSLog(@"%@",str);

        NSURL *url=[NSURLURLWithString:@"http://t1.baidu.com/it/u=3358554441,183798980&fm=25&gp=0.jpg"];

        NSData *data=[NSDatadataWithContentsOfURL:url];

        self.image2.image=[UIImageimageWithData:data];

    }

    if([str isEqualToString:@"3"]){

        NSLog(@"%@",str);

        NSURL *url=[NSURLURLWithString:@"http://t1.baidu.com/it/u=3476554757,4051152355&fm=25&gp=0.jpg"];

        NSData *data=[NSDatadataWithContentsOfURL:url];

        self.image3.image=[UIImageimageWithData:data];

    }

    if([str isEqualToString:@"4"]){

        NSLog(@"%@",str);

        NSURL *url=[NSURLURLWithString:@"http://t2.baidu.com/it/u=1357814838,2747965612&fm=25&gp=0.jpg"];

        NSData *data=[NSDatadataWithContentsOfURL:url];

        self.image4.image=[UIImageimageWithData:data];

    }

}

 

 

#########################################################

HTTP協議詳解

HTTP是一個屬於應用層的面向對象的協議,由於其簡捷、快速的方式,適用於分布式超媒體信息系統。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的規范化工作正在進行之中。

 http(超文本傳輸協議)是一個基於請求與響應模式的、無狀態的、應用層的協議,常基於TCP的連接方式,HTTP1.1版本中給出一種持續連接的機制,絕大多數的Web開發,都是構建在HTTP協議之上的Web應用。


HTTP協議的主要特點可概括如下:
1.支持客戶/服務器模式。
2.簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑。請求方法常用的有GETHEADPOST。每種方法規定了客戶與服務器聯系的類型不同。由於HTTP協議簡單,使得HTTP服務器的程序規模小,因而通信速度很快。
3.靈活:HTTP允許傳輸任意類型的數據對象。正在傳輸的類型由Content-Type加以標記。
4.無連接:無連接的含義是限制每次連接只處理一個請求。服務器處理完客戶的請求,並收到客戶的應答后,即斷開連接。采用這種方式可以節省傳輸時間。
5.無狀態:HTTP協議是無狀態協議。無狀態是指協議對於事務處理沒有記憶能力。缺少狀態意味着如果后續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大。另一方面,在服務器不需要先前信息時它的應答就較快。

URL

HTTP URL (URL統一資源定位符是一種特殊類型的URI是他的子類,包含了用於查找某個資源的足夠的信息)的格式如下:
錯誤!超鏈接引用無效。
]
http表示要通過HTTP協議來定位網絡資源;host表示合法的Internet主機域名或者IP地址;port指定一個端口號,為空則使用缺省端口80abs_path指定請求資源的URI;如果URL中沒有給出abs_path,那么當它作為請求URI時,必須以“/”的形式給出,通常這個工作瀏覽器自動幫我們完成。

 

#########################################################

TCP/UDP區別聯系

TCP---傳輸控制協議,提供的是面向連接、可靠的字節流服務。當客戶和服務器彼此交換數據前,必須先在雙方之間建立一個TCP連接,之后才能傳輸數據。TCP提供超時重發,丟棄重復數據,檢驗數據,流量控制等功能,保證數據能從一端傳到另一端。 

UDP---用戶數據報協議,是一個簡單的面向數據報的運輸層協議。UDP不提供可靠性,它只是把應用程序傳給IP層的數據報發送出去,但是並不能保證它們能到達目的地。由於UDP在傳輸數據報前不用在客戶和服務器之間建立一個連接,且沒有超時重發等機制,故而傳輸速度很快 

TCPTransmission Control Protocol,傳輸控制協議)是基於連接的協議,也就是說,在正式收發數據前,必須和對方建立可靠的連接。一個TCP連接必須要經過三次對話才能建立起來,我們來看看這三次對話的簡單過程:1.主機A向主機B發出連接請求數據包;2.主機B向主機A發送同意連接和要求同步(同步就是兩台主機一個在發送,一個在接收,協調工作)的數據包;3.主機A再發出一個數據包確認主機B的要求同步:我現在就發,你接着吧!,這是第三次對話。三次對話的目的是使數據包的發送和接收同步,經過三次對話之后,主機A才向主機B正式發送數據。 

UDPUser Data Protocol,用戶數據報協議)是與TCP相對應的協議。它是面向非連接的協議,它不與對方建立連接,而是直接就把數據包發送過去!  UDP適用於一次只傳送少量數據、對可靠性要求不高的應用環境。

 

tcp協議和udp協議的差別 

是否連接面向連接面向非連接 

傳輸可靠性可靠不可靠 

應用場合傳輸大量數據少量數據 

速度

 

#########################################################

NSURLConnection

蘋果公司提供了NSURLConnection進行同步異步請求,使用到類有NSURL/NSURLRequst/NSURLResponse等

同步異步請求:同步一旦發送數據程序停止用戶交互知道數據請求完成。異步不會柱塞主線程而會建立一個新的線程來炒作,發布請求后依然ui交互。

服務器訪問路徑支持get與post:get經參數寫在訪問路徑上安全性不高,_post請求將參數寫在body里安全,數據大。

 

#########################################################

ASIHTTPRequest

使用iOS SDK中的HTTP網絡請求API,相當的復雜,調用很繁瑣,ASIHTTPRequest就是一個對CFNetwork API進行了封裝,並且使用起來非常簡單的一套API,用Objective-C編寫,可以很好的應用在Mac OS X系統和iOS平台的應用程序中。ASIHTTPRequest適用於基本的HTTP請求,和基於REST的服務之間的交互。

ASIHTTPRequest功能很強大,主要特色如下:(進度信息、隊列請求、緩存、帶寬限制、斷點續傳

  • l 通過簡單的接口,即可完成向服務端提交數據和從服務端獲取數據的工作
  • l 下載的數據,可存儲到內存中或直接存儲到磁盤中
  • l 能上傳本地文件到服務端
  • l 可以方便的訪問和操作請求和返回的Http頭信息
  • l 可以獲取到上傳或下載的進度信息,為應用程序提供更好的體驗
  • l 支持上傳或下載隊列,並且可獲取隊列的進度信息
  • l 支持基本、摘要和NTLM身份認證,在同一會話中授權憑證會自動維持,並且可以存儲在KeychainMaciOS操作系統的密碼管理系統)中
  • l 支持Cookie
  • l 當應用(iOS 4+)在后台運行時,請求可以繼續運行
  • l 支持GZIP壓縮數據
  • l 內置的ASIDownloadCache類,可以緩存請求返回的數據,這樣即使沒有網絡也可以返回已經緩存的數據結果
  • l ASIWebPageRequest –可以下載完整的網頁,包括包含的網頁、樣式表、腳本等資源文件,並顯示在UIWebView /WebView中。任意大小的頁面都可以無限期緩存,這樣即使沒有網絡也可以離線瀏覽
  • l 支持客戶端證書
  • l 支持通過代理發起Http請求
  • l 支持帶寬限制。在iOS平台,可以根據當前網絡情況來自動決定是否限制帶寬,例如當使用WWAN(GPRS/Edge/3G)網絡時限制,而當使用WIFI時不做任何限制
  • l 支持斷點續傳
  • l 支持同步和異步請求
  • 斷點斷點續傳--------FTP(文件傳輸協議的簡稱)客戶端軟件斷點續傳指的是在下載或上傳時,將下載或上傳任務(一個文件或一個壓縮包)人為的划分為幾個部分,每一個部分采用一個線程進行上傳或下載,如果碰到網絡故障,可以從已經上傳或下載的部分開始繼續上傳下載以后未上傳下載的部分,而沒有必要從頭開始上傳下載。用途可以節省時間,提高速度。

ASIHTTPrequest同步請求

NSURL *urll=[NSURLURLWithString:@"http://t2.baidu.com/it/u=2078118331,2529770785&fm=0&gp=0.jpg"];

    ASIHTTPRequest *req=[ASIHTTPRequestrequestWithURL:urll];

    [req startSynchronous];

    NSError *eror=[req error];

    if (!eror) {

        NSData *dd=[req responseData];

        self.showimage.image=[UIImageimageWithData:dd];

    }

ASIHTTPrequest異步請求

 NSURL *urll=[NSURLURLWithString:@"http://t2.baidu.com/it/u=1690508666,3359236730&fm=25&gp=0.jpg"];

    ASIHTTPRequest *req=[ASIHTTPRequestrequestWithURL:urll];

    [req startAsynchronous];

    req.delegate=self;

//網絡代理

- (void)requestFinished:(ASIHTTPRequest *)request{

    NSData *dd=[request responseData];

    self.showimage.image=[UIImageimageWithData:dd];

}

- (void)requestFailed:(ASIHTTPRequest *)request{

    NSLog(@"錯誤%@",[request error]);

}

 

ASIHTTPrequest隊列請求

- (IBAction)queueReqest:(id)sender {

    if (!self.queue) {

        self.queue=[[ASINetworkQueuealloc]init];

    }

    NSURL *uurl1=[NSURLURLWithString:@"http://i.baidu.com/yule/r/image/2010-10-07/fff464e09e8172466430657f39972d9f.jpg"];

    NSURL *uurl2=[NSURLURLWithString:@"http://pic1.hebei.com.cn/0/10/77/80/10778082_985271.jpg"];//佟麗婭

    NSURL *uurl3=[NSURLURLWithString:@"http://www.hongname.com/mxtp/z/good/lijx2/26.jpg"];//李嘉欣

    NSURL *uurl4=[NSURLURLWithString:@"http://pic3.nipic.com/20090707/2868466_000446284_2.jpg"];//張雨綺

    

    ASIHTTPRequest *req1=[ASIHTTPRequestrequestWithURL:uurl1];

    ASIHTTPRequest *req2=[ASIHTTPRequestrequestWithURL:uurl2];

    ASIHTTPRequest *req3=[ASIHTTPRequestrequestWithURL:uurl3];

    ASIHTTPRequest *req4=[ASIHTTPRequestrequestWithURL:uurl4];

    

    //請求自帶的字典用於辨別請求

    req1.userInfo=[NSDictionarydictionaryWithObject:@"req1"forKey:@"name"];

    req2.userInfo=[NSDictionarydictionaryWithObject:@"req2"forKey:@"name"];

    req3.userInfo=[NSDictionarydictionaryWithObject:@"req3"forKey:@"name"];

    req4.userInfo=[NSDictionarydictionaryWithObject:@"req4"forKey:@"name"];

    

    self.queue.delegate=self;

    [queuesetRequestDidFinishSelector:@selector(dofinish:)];//設置請求結束時進的方法

    [queuesetRequestDidFailSelector:@selector(dofail:)];//設置隊列請求失敗的方法

//    queue.maxConcurrentOperationCount=1;

    [queueaddOperation:req1];

    [queueaddOperation:req2];

    [queueaddOperation:req3];

    [queueaddOperation:req4];

 

    [self.queuego];//啟動請求隊列

}

-(void)dofinish:(ASIHTTPRequest *)sender{

    NSLog(@"次數");

    NSString *temp=[sender.userInfoobjectForKey:@"name"];

    NSData *dd=[sender responseData];

    if ([temp isEqualToString:@"req1"]) {

        NSLog(@"1temp%@",temp);

//        NSData *dd=[sender responseData];

        self.showimage.image=[UIImageimageWithData:dd];

    }else

    if ([temp isEqualToString:@"req2"]) {

        NSLog(@"2temp%@",temp);

//        NSData *dd=[sender responseData];

        self.imageview2.image=[UIImageimageWithData:dd];    

    }else

    if ([temp isEqualToString:@"req3"]) {

        NSLog(@"3temp%@",temp);

//        NSData *dd=[sender responseData];

        self.imageview3.image=[UIImageimageWithData:dd];    

    }else

    if ([temp isEqualToString:@"req4"]) {

        NSLog(@"4temp%@",temp);

//        NSData *dd=[sender responseData];

        self.imageview4.image=[UIImageimageWithData:dd];    

    }

}

-(void)dofail:(ASIHTTPRequest *)requs{

    NSLog(@"%@",[requs error]);

}

 

 

#########################################################

socket連接和http連接的區別

簡單說,你瀏覽的網頁(網址以http://開頭)都是http協議傳輸到你的瀏覽器的, 而http是基於socket之上的。socket是一套完成tcp,udp協議的接口。

HTTP協議:簡單對象訪問協議,對應於應用層  ,HTTP協議是基於TCP連接的

tcp協議:    對應於傳輸層

ip協議:     對應於網絡層
TCP/IP是傳輸層協議,主要解決數據如何在網絡中傳輸;而HTTP是應用層協議,主要解決如何包裝數據。

Socket是對TCP/IP協議的封裝,Socket本身並不是協議,而是一個調用接口(API),通過Socket,我們才能使用TCP/IP協議。

http連接:http連接就是所謂的短連接,即客戶端向服務器端發送一次請求,服務器端響應后連接即會斷掉;

socket連接:socket連接就是所謂的長連接,理論上客戶端和服務器端一旦建立起連接將不會主動斷掉;但是由於各種環境因素可能會是連接斷開,比如說:服務器端或客戶端主機down了,網絡故障,或者兩者之間長時間沒有數據傳輸,網絡防火牆可能會斷開該連接以釋放網絡資源。所以當一個socket連接中沒有數據的傳輸,那么為了維持連接需要發送心跳消息~~具體心跳消息格式是開發者自己定義的

我們已經知道網絡中的進程是通過socket來通信的,那什么是socket呢?socket起源於Unix,而Unix/Linux基本哲學之一就是一切皆文件,都可以用打開open –> 讀寫write/read –> 關閉close”模式來操作。我的理解就是Socket就是該模式的一個實現,socket即是一種特殊的文件,一些socket函數就是對其進行的操作(讀/IO、打開、關閉),這些函數我們在后面進行介紹。

 

Socket連接與HTTP連接

我們在傳輸數據時,可以只使用(傳輸層)TCP/IP協議,但是那樣的話,如果沒有應用層,便無法識別數據內容,如果想要使傳輸的數據有意義,則必須使用到應用層協議,應用層協議有很多,比如HTTPFTPTELNET等,也可以自己定義應用層協議。WEB使用HTTP協議作應用層協議,以封裝HTTP文本信息,然后使用TCP/IP做傳輸層協議將它發到網絡上。
1)Socket是一個針對TCPUDP編程的接口,你可以借助它建立TCP連接等等。而TCPUDP協議屬於傳輸層 
 http是個應用層的協議,它實際上也建立在TCP協議之上。 

 (HTTP是轎車,提供了封裝或者顯示數據的具體形式;Socket是發動機,提供了網絡通信的能力。)

 2Socket是對TCP/IP協議的封裝,Socket本身並不是協議,而是一個調用接口(API),通過Socket,我們才能使用TCP/IP協議。Socket的出現只是使得程序員更方便地使用TCP/IP協議棧而已,是對TCP/IP協議的抽象,從而形成了我們知道的一些最基本的函數接口。

下面是一些的重要的概念,特在此做摘抄和總結。

一。什么是TCP連接的三次握手

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

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

二。利用Socket建立網絡連接的步驟

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

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

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

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

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

三。HTTP鏈接的特點

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

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

四。TCPUDP的區別

1TCP是面向鏈接的,雖然說網絡的不安全不穩定特性決定了多少次握手都不能保證連接的可靠性,但TCP的三次握手在最低限度上(實際上也很大程度上保證了)保證了連接的可靠性;而UDP不是面向連接的,UDP傳送數據前並不與對方建立連接,對接收到的數據也不發送確認信號,發送端不知道數據是否會正確接收,當然也不用重發,所以說UDP是無連接的、不可靠的一種數據傳輸協議。

2。也正由於1所說的特點,使得UDP的開銷更小數據傳輸速率更高,因為不必進行收發數據的確認,所以UDP的實時性更好。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM