iOS learns socket programming--http1.0 client from scratch

Source: Internet
Author: User
<span id="Label3"></p><p><p>Before you begin the socket programming, you need to define several concepts First:<br>1. The network of two programs through a two-way communication connection to achieve the exchange of data, one end of this connection is called a socket.<br>2.socket Chinese name is "socket", is based on TCP/IP protocol communication Mechanism.<br>3. The client socket connection needs to specify the Host's IP address and port, the IP address is similar to the home address, is used to uniquely confirm a host, and the port is similar to the house number, used to uniquely confirm a program on the Host.</p></p><p><p>We simulate an HTTP Request. First enter in the terminal</p></p><pre class="prettyprint"><pre class="prettyprint"><code class=" hljs nginx"><span class="hljs-title">telnet</span><span class="hljs-number">202.118.1.7</span><span class="hljs-number">80</span></code></pre></pre><p><p>We're going to get this hint.</p></p><pre class="prettyprint"><pre class="prettyprint"><code class=" hljs r"><span class="hljs-number">202.118</span><span class="hljs-number">.1</span><span class="hljs-number">.7</span><span class="hljs-keyword">...</span><span class="hljs-string">‘^]‘</span>.</code></pre></pre><p><p>This indicates that a socket connection has been established with the server and the next step is to pass the Parameters.<br>Input:</p></p><pre class="prettyprint"><pre class="prettyprint"><code class=" hljs http"><span class="hljs-request">GET <span class="hljs-string">/</span> HTTP/1.0</span><span class="hljs-attribute">HOST</span><span class="hljs-string">www.neu.edu.cn</span></code></pre></pre><p><p>Two times return to get such data</p></p><pre class="prettyprint"><code class=" hljs http"><span class="hljs-status"><span class="hljs-status">http/1.1 <span class="hljs-number"></span> OK</span></span><span class="hljs-attribute"><span class="hljs-attribute">Date</span></span>:<span class="hljs-string"><span class="hljs-string">Thu, Apr 13:58:33 GMT</span></span><span class="hljs-attribute"><span class="hljs-attribute">Content-type</span></span>:<span class="hljs-string"><span class="hljs-string">text/html</span></span><span class="hljs-attribute"><span class="hljs-attribute">Content-length</span></span>:<span class="hljs-string"><span class="hljs-string">9710</span></span><span class="hljs-attribute"><span class="hljs-attribute">last-modified</span></span>:<span class="hljs-string"><span class="hljs-string">Thu, Apr 08:51:04 GMT</span></span><span class="hljs-attribute"><span class="hljs-attribute">Connection</span></span>:<span class="hljs-string"><span class="hljs-string">Close</span></span><span class="hljs-attribute"><span class="hljs-attribute">Vary</span></span>:<span class="hljs-string"><span class="hljs-string">accept-encoding</span></span><span class="hljs-attribute"><span class="hljs-attribute">ETag</span></span>:<span class="hljs-string"><span class="hljs-string">"552f77f8-25ee"</span></span><span class="hljs-attribute"><span class="hljs-attribute">Server</span></span>:<span class="hljs-string"><span class="hljs-string">apache/2.4.12 (FreeBSD)</span></span><span class="hljs-attribute"><span class="hljs-attribute">accept-ranges</span></span>:<span class="hljs-string"><span class="hljs-string">bytes</span></span><span class="xml"><span class="xml"> <span class="hljs-doctype"><! DOCTYPE HTML Public "-//w3c//dtd XHTML 1.0 transitional//en" "HTTP://WWW.W3.ORG/TR/XHTML1/DTD/XHTML1-TRANSITIONAL.DTD "></span><span class="hljs-tag"><<span class="hljs-title">html</span> <span class="hljs-attribute">xmlns</span>=<span class="hljs-value">" http://www.w3.org/1999/xhtml "</span>></span>..... </span></span></code></pre><p><p>This means that the request has been successful, where the blank line above is the request to return the header, the browser needs to parse the data, it is useful for us is the Content-type field and the blank line below the Content. The Content-type field tells us how the next data should be Saved.</p></p><p><p>The HTTP protocol is based on the TCP/IP protocol, so it is obvious that the socket can be used to simulate an HTTP Request. iOS provides a c-based socket programming interface Cfsocket and Input-output stream cfreadstreamref, cfwritestreamref, but its implementation is more complex, Here we use the famous Asyncsocket Open source framework for socket PROGRAMMING. The use of Asyncsocket does not affect our understanding of the socket, but also by QQ and other well-known software for instant messaging, file transfer and other Functions.<br>Asyncsocket:https://github.com/robbiehanson/cocoaasyncsocket<br>After downloading, copy the AsyncSocket.h and ASYNCSOCKET.M under the Runloop folder to the project file for Use.<br>It is necessary to note that Asyncsocket is based on Runloop and can invoke the method asynchronously and does not need to open one more thread.</p></p><p><p>We create a new Socketdemoviewcontroller class, because it is a simple HTTP client, so all operations, views will be implemented in this class. In this simple client, we will simulate an HTTP access, return the header to the screen, and save the acquired image and HTML File.</p></p><pre class="prettyprint"><code class=" hljs objectivec"><span class="hljs-comment"><span class="hljs-comment">//socketdemoviewcontroller.h</span></span><span class="hljs-preprocessor"><span class="hljs-preprocessor">#import <span class="hljs-title"><UIKit/UIKit.h></span> </span></span><span class="hljs-preprocessor"><span class="hljs-preprocessor">#import <span class="hljs-title">"AsyncSocket.h"</span> </span></span><span class="hljs-preprocessor"><span class="hljs-preprocessor">#define HOST_IP @ "202.118.1.7"</span></span><span class="hljs-preprocessor"><span class="hljs-preprocessor">#define Host_port</span></span><span class="hljs-class"><span class="hljs-class"> <span class="hljs-keyword">@interface</span> <span class="hljs-title">socketdemoviewcontroller</span> : <span class="hljs-title">uiviewcontroller</span> <<span class="hljs-title">uitextviewdelegate </span>></span></span><span class="hljs-keyword"><span class="hljs-keyword">@property</span></span>(<span class="hljs-keyword"><span class="hljs-keyword">nonatomic</span></span>,<span class="hljs-keyword"><span class="hljs-keyword">Strong</span></span>) Asyncsocket *client;<span class="hljs-keyword"><span class="hljs-keyword">@property</span></span>(<span class="hljs-keyword"><span class="hljs-keyword">nonatomic</span></span>,<span class="hljs-keyword"><span class="hljs-keyword">Strong</span></span>)<span class="hljs-built_in"><span class="hljs-built_in">Uitextview</span></span>*inputmsg;<span class="hljs-keyword"><span class="hljs-keyword">@property</span></span>(<span class="hljs-keyword"><span class="hljs-keyword">nonatomic</span></span>,<span class="hljs-keyword"><span class="hljs-keyword">Strong</span></span>)<span class="hljs-built_in"><span class="hljs-built_in">Uitextview</span></span>*outputmsg;<span class="hljs-keyword"><span class="hljs-keyword">@property</span></span>(<span class="hljs-keyword"><span class="hljs-keyword">nonatomic</span></span>,<span class="hljs-keyword"><span class="hljs-keyword">Strong</span></span>)<span class="hljs-built_in"><span class="hljs-built_in">NSString</span></span>*filename;<span class="hljs-keyword"><span class="hljs-keyword">@property</span></span>(<span class="hljs-keyword"><span class="hljs-keyword">nonatomic</span></span>,<span class="hljs-keyword"><span class="hljs-keyword">Strong</span></span>) Nsmutabledata *receivedata;-(<span class="hljs-keyword"><span class="hljs-keyword">int</span></span>) Connectserver: (<span class="hljs-built_in"><span class="hljs-built_in">NSString</span></span>*) HostIP Port: (<span class="hljs-keyword"><span class="hljs-keyword">int</span></span>) hostport;-(<span class="hljs-keyword"><span class="hljs-keyword">void</span></span>) sendmsg;-(<span class="hljs-keyword"><span class="hljs-keyword">void</span></span>) reconnect;</code></pre><p><p>Host_ip and Host_port I chose the Northeastern University homepage Www.neu.edu.cn.<br>We created an object client for the Asyncsocket class, and two textview are used to display the input and output content. The ConnectServer method connects to the server, reconnect reconnect, and the Sendmsg method sends data to the Server.</p></p><p><p>Next is the socketdemoviewcontroller.m code, a bit long and slowly analyzed.</p></p><pre class="prettyprint"><code class=" hljs objectivec"><span class="hljs-preprocessor"><span class="hljs-preprocessor">#import <span class="hljs-title">"SocketDemoViewController.h"</span> </span></span><span class="hljs-class"><span class="hljs-class"> <span class="hljs-keyword">@implementation</span> <span class="hljs-title">socketdemoviewcontroller</span> </span></span><span class="hljs-keyword"><span class="hljs-keyword">@synthesize</span></span>inputmsg, outputmsg,filename,receivedata;<span class="hljs-keyword"><span class="hljs-keyword">@synthesize</span></span>client;-(<span class="hljs-keyword"><span class="hljs-keyword">void</span></span>) Viewdidload {[<span class="hljs-keyword"><span class="hljs-keyword">Super</span></span>viewdidload];<span class="hljs-comment"><span class="hljs-comment">implementation of The//ui part</span></span>Inputmsg = [[<span class="hljs-built_in"><span class="hljs-built_in">Uitextview</span></span>alloc] Initwithframe:cgrectmake (<span class="hljs-number"><span class="hljs-number">10.0</span></span>F<span class="hljs-number"><span class="hljs-number">40.0</span></span>F<span class="hljs-number"><span class="hljs-number">355.0</span></span>F<span class="hljs-number"><span class="hljs-number">100.0</span></span>f)]; Inputmsg<span class="hljs-variable"><span class="hljs-variable">. Delegate</span></span>=<span class="hljs-keyword"><span class="hljs-keyword"></span> self</span>; Inputmsg<span class="hljs-variable"><span class="hljs-variable">. BackgroundColor</span></span>= [<span class="hljs-built_in"><span class="hljs-built_in">Uicolor</span></span>lightgraycolor]; [<span class="hljs-keyword"><span class="hljs-keyword"></span> self</span><span class="hljs-variable"><span class="hljs-variable">. View</span></span>addsubview:inputmsg]; Outputmsg = [[<span class="hljs-built_in"><span class="hljs-built_in">Uitextview</span></span>alloc] Initwithframe:cgrectmake (<span class="hljs-number"><span class="hljs-number">10.0</span></span>F<span class="hljs-number"><span class="hljs-number">180.0</span></span>F<span class="hljs-number"><span class="hljs-number">355.0</span></span>F<span class="hljs-number"><span class="hljs-number">150.0</span></span>f)]; Outputmsg<span class="hljs-variable"><span class="hljs-variable">. TextColor</span></span>= [<span class="hljs-built_in"><span class="hljs-built_in">Uicolor</span></span>redcolor]; Outputmsg<span class="hljs-variable"><span class="hljs-variable">. BackgroundColor</span></span>= [<span class="hljs-built_in"><span class="hljs-built_in">Uicolor</span></span>lightgraycolor]; [<span class="hljs-keyword"><span class="hljs-keyword"></span> self</span><span class="hljs-variable"><span class="hljs-variable">. View</span></span>addsubview:outputmsg];<span class="hljs-built_in"><span class="hljs-built_in">UIButton</span></span>*btnsend = [<span class="hljs-built_in"><span class="hljs-built_in">UIButton</span></span>buttonwithtype:uibuttontyperoundedrect]; Btnsend<span class="hljs-variable"><span class="hljs-variable">. Frame</span></span>= CGRectMake (<span class="hljs-number"><span class="hljs-number">150.0</span></span>F<span class="hljs-number"><span class="hljs-number">350.0</span></span>F<span class="hljs-number"><span class="hljs-number">75.0</span></span>F<span class="hljs-number"><span class="hljs-number">30.0</span></span>f); [btnsend settitle: @<span class="hljs-string"><span class="hljs-string">"send"</span></span>forstate:uicontrolstatenormal]; [btnsend addTarget:<span class="hljs-keyword"><span class="hljs-keyword"></span> self</span>Action<span class="hljs-keyword"><span class="hljs-keyword">@selector</span></span>(sendmsg) forcontrolevents:uicontroleventtouchupinside]; [<span class="hljs-keyword"><span class="hljs-keyword"></span> self</span><span class="hljs-variable"><span class="hljs-variable">. View</span></span>addsubview:btnsend];<span class="hljs-built_in"><span class="hljs-built_in">UIButton</span></span>*reconnect = [<span class="hljs-built_in"><span class="hljs-built_in">UIButton</span></span>buttonwithtype:uibuttontyperoundedrect]; Reconnect<span class="hljs-variable"><span class="hljs-variable">. Frame</span></span>= CGRectMake (<span class="hljs-number"><span class="hljs-number">150.0</span></span>F<span class="hljs-number"><span class="hljs-number">400.0</span></span>F<span class="hljs-number"><span class="hljs-number">75.0</span></span>F<span class="hljs-number"><span class="hljs-number">30.0</span></span>f); [reconnect settitle: @<span class="hljs-string"><span class="hljs-string">"reconnect"</span></span>forstate:uicontrolstatenormal]; [reconnect addTarget:<span class="hljs-keyword"><span class="hljs-keyword"></span> self</span>Action<span class="hljs-keyword"><span class="hljs-keyword">@selector</span></span>(reconnect) forcontrolevents:uicontroleventtouchupinside]; [<span class="hljs-keyword"><span class="hljs-keyword"></span> self</span><span class="hljs-variable"><span class="hljs-variable">. View</span></span>addsubview:reconnect];<span class="hljs-comment"><span class="hljs-comment">//connect to the server</span></span>[<span class="hljs-keyword"><span class="hljs-keyword"></span> self</span>Connectserver:host_ip port:host_port]; }<span class="hljs-comment"><span class="hljs-comment">//link Server</span></span>- (<span class="hljs-keyword"><span class="hljs-keyword">int</span></span>) Connectserver: (<span class="hljs-built_in"><span class="hljs-built_in">NSString</span></span>*) HostIP Port: (<span class="hljs-keyword"><span class="hljs-keyword">int</span></span>) hostport{<span class="hljs-keyword"><span class="hljs-keyword">if</span></span>(client = =<span class="hljs-literal"><span class="hljs-literal">Nil</span></span>{client = [[asyncsocket alloc] initwithdelegate:<span class="hljs-keyword"><span class="hljs-keyword"></span> self</span>];<span class="hljs-comment"><span class="hljs-comment">//initialize client, Remember to set proxy</span></span> <span class="hljs-built_in"><span class="hljs-built_in">Nserror</span></span>*err =<span class="hljs-literal"><span class="hljs-literal">Nil</span></span>;<span class="hljs-keyword"><span class="hljs-keyword">if</span></span>(! [client Connecttohost:hostip Onport:hostport Error:&err]) {<span class="hljs-comment"><span class="hljs-comment">//connection failed</span></span> <span class="hljs-keyword"><span class="hljs-keyword">return</span></span> <span class="hljs-number"><span class="hljs-number">2</span></span>; }<span class="hljs-keyword"><span class="hljs-keyword">Else</span></span>{<span class="hljs-built_in"><span class="hljs-built_in">NSLog</span></span>(@<span class="hljs-string"><span class="hljs-string">"connection succeeded"</span></span>);<span class="hljs-keyword"><span class="hljs-keyword">return</span></span> <span class="hljs-number"><span class="hljs-number">1</span></span>; } }<span class="hljs-keyword"><span class="hljs-keyword">Else</span></span>{[client readdatawithtimeout:-<span class="hljs-number"><span class="hljs-number">1</span></span>Tag<span class="hljs-number"><span class="hljs-number">0</span></span>];<span class="hljs-keyword"><span class="hljs-keyword">return</span></span> <span class="hljs-number"><span class="hljs-number">0</span></span>; }}- (<span class="hljs-keyword"><span class="hljs-keyword">void</span></span>) reconnect{<span class="hljs-keyword"><span class="hljs-keyword">int</span></span>Stat = [<span class="hljs-keyword"><span class="hljs-keyword"></span> self</span>Connectserver:host_ip port:host_port];} - (<span class="hljs-keyword"><span class="hljs-keyword">void</span></span>) sendmsg{<span class="hljs-comment"><span class="hljs-comment">//send inputmsg content to the server</span></span> <span class="hljs-built_in"><span class="hljs-built_in">NSString</span></span>*inputmsgstr =<span class="hljs-keyword"><span class="hljs-keyword"></span> self</span><span class="hljs-variable"><span class="hljs-variable">. Inputmsg</span></span><span class="hljs-variable"><span class="hljs-variable">. Text</span></span>; NSData *data = [inputmsgstr datausingencoding:nsutf8stringencoding]; [client Writedata:data withtimeout:-<span class="hljs-number"><span class="hljs-number">1</span></span>Tag<span class="hljs-number"><span class="hljs-number">0</span></span>];}<span class="hljs-preprocessor"><span class="hljs-preprocessor">#pragma mark-</span></span><span class="hljs-preprocessor"><span class="hljs-preprocessor">#pragma mark Close Keyboard</span></span>- (<span class="hljs-keyword"><span class="hljs-keyword">void</span></span>) textfielddidendediting: (uitextfield *) textfield{[inputmsg resignfirstresponder];} - (<span class="hljs-built_in"><span class="hljs-built_in">BOOL</span></span>) textfieldshouldreturn: (uitextfield *) textfield{[inputmsg resignfirstresponder];<span class="hljs-keyword"><span class="hljs-keyword">return</span></span> <span class="hljs-literal"><span class="hljs-literal">YES</span></span>;} - (<span class="hljs-keyword"><span class="hljs-keyword">void</span></span>) touchesbegan: (nsset *) touches withevent: (uievent *) event{[inputmsg resignfirstresponder];}<span class="hljs-preprocessor"><span class="hljs-preprocessor">#pragma mark Socket Delegate</span></span>- (<span class="hljs-keyword"><span class="hljs-keyword">void</span></span>) onsocket: (asyncsocket *) sock didconnecttohost: (<span class="hljs-built_in"><span class="hljs-built_in">NSString</span></span>*) host Port: (UINT16) port{<span class="hljs-comment"><span class="hljs-comment">//successfully connected to the server execution callback function</span></span>[client readdatawithtimeout:-<span class="hljs-number"><span class="hljs-number">1</span></span>Tag<span class="hljs-number"><span class="hljs-number">0</span></span>];} - (<span class="hljs-keyword"><span class="hljs-keyword">void</span></span>) onsocketdiddisconnect: (asyncsocket *) sock{client =<span class="hljs-literal"><span class="hljs-literal">Nil</span></span>;<span class="hljs-comment"><span class="hljs-comment">//empty Client</span></span>}- (<span class="hljs-keyword"><span class="hljs-keyword">void</span></span>) onsocket: (asyncsocket *) sock didreaddata: (nsdata *) data withtag: (<span class="hljs-keyword"><span class="hljs-keyword">Long</span></span>) tag{<span class="hljs-comment"><span class="hljs-comment">//processing of received data</span></span> <span class="hljs-keyword"><span class="hljs-keyword">if</span></span>(receivedata = =<span class="hljs-literal"><span class="hljs-literal">Nil</span></span>{receivedata = [[nsmutabledata alloc] init]; } [receivedata appenddata:data];<span class="hljs-built_in"><span class="hljs-built_in">NSString</span></span>* AStr = [[<span class="hljs-built_in"><span class="hljs-built_in">NSString</span></span>alloc] Initwithdata:receivedata encoding:nsutf8stringencoding];<span class="hljs-built_in"><span class="hljs-built_in">Nsrange</span></span>EndRange = [aStr rangeofstring:@<span class="hljs-string"><span class="hljs-string">"\ r"</span></span>];<span class="hljs-keyword"><span class="hljs-keyword">if</span></span>(endrange<span class="hljs-variable"><span class="hljs-variable">.</span> location</span>!=<span class="hljs-built_in"><span class="hljs-built_in">Nsnotfound</span></span>) {<span class="hljs-built_in"><span class="hljs-built_in">Nsrange</span></span>Range = [aStr rangeofstring:@<span class="hljs-string"><span class="hljs-string">"\r\n\r\n"</span></span>];<span class="hljs-keyword"><span class="hljs-keyword">if</span></span>(range<span class="hljs-variable"><span class="hljs-variable">.</span> location</span>!=<span class="hljs-built_in"><span class="hljs-built_in">Nsnotfound</span></span>) {<span class="hljs-built_in"><span class="hljs-built_in">NSString</span></span>*requestheader = [aStr Substringtoindex: (<span class="hljs-keyword"><span class="hljs-keyword">unsigned</span></span> <span class="hljs-keyword"><span class="hljs-keyword">Long</span></span>) Range<span class="hljs-variable"><span class="hljs-variable">.</span> location</span>];<span class="hljs-keyword"><span class="hljs-keyword"></span> self</span><span class="hljs-variable"><span class="hljs-variable">. Outputmsg</span></span><span class="hljs-variable"><span class="hljs-variable">. Text</span></span>= requestheader; }<span class="hljs-keyword"><span class="hljs-keyword">Else</span></span>{<span class="hljs-keyword"><span class="hljs-keyword"></span> self</span><span class="hljs-variable"><span class="hljs-variable">. Outputmsg</span></span><span class="hljs-variable"><span class="hljs-variable">. Text</span></span>= aStr; }<span class="hljs-comment"><span class="hljs-comment">//get Real requests to the data</span></span>NSData *contentdata = [<span class="hljs-keyword"><span class="hljs-keyword"></span> self</span>getcontentdatawithdata:data];<span class="hljs-built_in"><span class="hljs-built_in">Nsrange</span></span>Htmlrange = [aStr rangeofstring:@<span class="hljs-string"><span class="hljs-string">"text/html"</span></span>];<span class="hljs-keyword"><span class="hljs-keyword">if</span></span>(htmlrange<span class="hljs-variable"><span class="hljs-variable">.</span> location</span>!=<span class="hljs-built_in"><span class="hljs-built_in">Nsnotfound</span></span>) {<span class="hljs-built_in"><span class="hljs-built_in">Nsarray</span></span>*paths =nssearchpathfordirectoriesindomains (nsdocumentdirectory,nsuserdomainmask,<span class="hljs-literal"><span class="hljs-literal">YES</span></span>);<span class="hljs-built_in"><span class="hljs-built_in">NSString</span></span>*documentsdirectory =[paths objectatindex:<span class="hljs-number"><span class="hljs-number">0</span></span>];<span class="hljs-built_in"><span class="hljs-built_in">NSString</span></span>*ducumentplistpath = [documentsdirectory stringbyappendingpathcomponent:@<span class="hljs-string"><span class="hljs-string">"get.html"</span></span>];<span class="hljs-comment"><span class="hljs-comment">//plist File Location</span></span>[[<span class="hljs-built_in"><span class="hljs-built_in">Nsfilemanager</span></span>defaultmanager] Createfileatpath:ducumentplistpath Contents:contentdata attributes:<span class="hljs-literal"><span class="hljs-literal">Nil</span></span>]; }<span class="hljs-built_in"><span class="hljs-built_in">Uiimageview</span></span>*IMGV = [[<span class="hljs-built_in"><span class="hljs-built_in">Uiimageview</span></span>Alloc]initwithframe:cgrectmake (<span class="hljs-number"><span class="hljs-number">0</span></span>,<span class="hljs-number"><span class="hljs-number">0</span></span>,<span class="hljs-number"><span class="hljs-number"></span> -</span>,<span class="hljs-number"><span class="hljs-number"></span> -</span>)]; Imgv<span class="hljs-variable"><span class="hljs-variable">. Image</span></span>= [<span class="hljs-built_in"><span class="hljs-built_in">UIImage</span></span>imagewithdata:contentdata];<span class="hljs-keyword"><span class="hljs-keyword">if</span></span>(imgv<span class="hljs-variable"><span class="hljs-variable">. Image</span></span>!=<span class="hljs-literal"><span class="hljs-literal">Nil</span></span>) { [<span class="hljs-keyword"><span class="hljs-keyword"></span> self</span><span class="hljs-variable"><span class="hljs-variable">. View</span></span>addsubview:imgv]; Uiimagewritetosavedphotosalbum (IMGV<span class="hljs-variable"><span class="hljs-variable">. Image</span></span>,<span class="hljs-keyword"><span class="hljs-keyword"></span> self</span>,<span class="hljs-keyword"><span class="hljs-keyword">@selector</span></span>(imageSavedToPhotosAlbum:didFinishSavingWithError:contextInfo:),<span class="hljs-literal"><span class="hljs-literal">Nil</span></span>); } Receivedata =<span class="hljs-literal"><span class="hljs-literal">Nil</span></span>; } [client readdatawithtimeout:-<span class="hljs-number"><span class="hljs-number">1</span></span>Tag<span class="hljs-number"><span class="hljs-number">0</span></span>];} -(nsdata *) getcontentdatawithdata: (nsdata *) data{<span class="hljs-comment"><span class="hljs-comment">//separates the data block from the return header, returning the requested data of type NSData</span></span> <span class="hljs-built_in"><span class="hljs-built_in">NSString</span></span>*tosearch = @<span class="hljs-string"><span class="hljs-string">"\r\n\r\n"</span></span>; NSData *target = [tosearch datausingencoding:nsutf8stringencoding];<span class="hljs-built_in"><span class="hljs-built_in">Nsrange</span></span>Doublechangeline = [data Rangeofdata:target options:<span class="hljs-number"><span class="hljs-number">0</span></span>Range:nsmakerange (<span class="hljs-number"><span class="hljs-number">0</span></span>, [data length]];<span class="hljs-keyword"><span class="hljs-keyword">if</span></span>(doublechangeline<span class="hljs-variable"><span class="hljs-variable">.</span> location</span>!=<span class="hljs-built_in"><span class="hljs-built_in">Nsnotfound</span></span>) {nsdata *content = [data Subdatawithrange:nsmakerange (doublechangeline<span class="hljs-variable"><span class="hljs-variable">.</span> location</span>+<span class="hljs-number"><span class="hljs-number">4</span></span>, [data Length]-doublechangeline<span class="hljs-variable"><span class="hljs-variable">.</span> location</span>-<span class="hljs-number"><span class="hljs-number">4</span></span>)];<span class="hljs-keyword"><span class="hljs-keyword">return</span></span>Content }<span class="hljs-keyword"><span class="hljs-keyword">Else</span></span>{<span class="hljs-keyword"><span class="hljs-keyword">return</span></span> <span class="hljs-literal"><span class="hljs-literal">Nil</span></span>; }}- (<span class="hljs-keyword"><span class="hljs-keyword">void</span></span>) Imagesavedtophotosalbum: (<span class="hljs-built_in"><span class="hljs-built_in">UIImage</span></span>*) Image Didfinishsavingwitherror: (<span class="hljs-built_in"><span class="hljs-built_in">Nserror</span></span>*) Error Contextinfo: (<span class="hljs-keyword"><span class="hljs-keyword">void</span></span>*) contextinfo{<span class="hljs-comment"><span class="hljs-comment">//save the image to a local album</span></span> <span class="hljs-keyword"><span class="hljs-keyword">if</span></span>(!error) {<span class="hljs-built_in"><span class="hljs-built_in">NSLog</span></span>(@<span class="hljs-string"><span class="hljs-string">"save to album successfully"</span></span>); }}<span class="hljs-keyword"><span class="hljs-keyword">@end</span></span></code></pre><p><p>After you run the program, you can simulate the HTTP request by entering the section of code in the previous command line (remember to wrap it, see the position of the cursor) in the input box.<br><br>In Onsocket: (asyncsocket <em>) sock didreaddata: (nsdata </em>) data withtag: (long) in the tag method, we select how the data is processed according to the Content-type field, and save the HTML file in the Get.html method under the sandbox documents Directory. Pictures that may exist are saved in a local photo album.<br>For detailed Didreaddata parsing, refer to the previous article: "asyncsocket didreaddata functions in detail"<br>http://blog.csdn.net/abc649395594/article/details/45046871</p></p> <p><p>iOS learns socket programming--http1.0 client from scratch</p></p></span>

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.