IOS AsyncSocket – iPhone手機開發技術文章 iPhone軟體開發教學課程

    先分享下

 

    NSLog(@"model — %@",[UIDevice currentDevice].model);//判斷是iphone或是ipad等

 

    NSLog(@"version — %@",[UIDevice currentDevice].systemVersion);//系統版本

 

 

 

  下面的就是把頭文件裡的東西搬瞭出來

 

– (id)init;

– (id)initWithDelegate:(id)delegate;

 

 

 

/**

 * Tells the socket to begin listening and accepting connections on the given port.

 * When a connection comes in, the AsyncSocket instance will call the various delegate methods (see above).

 * The socket will listen on all available interfaces (e.g. wifi, ethernet, etc)

**/

– (BOOL)acceptOnPort:(UInt16)port error:(NSError **)errPtr;

 

在指定的端口偵聽

 

 

 

/**

 * Connects to the given host and port.

 * The host may be a domain name (e.g. "deusty.com") or an IP address string (e.g. "192.168.0.2")

**/

– (BOOL)connectToHost:(NSString *)hostname onPort:(UInt16)port error:(NSError **)errPtr;

 

向指定的host和端口連接,host格式可以是www.baidu.com 或者 192.168.100.100,它的timeout為-1.

 

 

/**

 * This method is the same as connectToHost:onPort:error: with an additional timeout option.

 * To not time out use a negative time interval, or simply use the connectToHost:onPort:error: method.

**/

– (BOOL)connectToHost:(NSString *)hostname

               onPort:(UInt16)port

          withTimeout:(NSTimeInterval)timeout

                error:(NSError **)errPtr;

 

和connectToHost:onPort:error: 差不多,就是加瞭個連接時間限制

 

 

 

/**

 * Connects to the given address, specified as a sockaddr structure wrapped in a NSData object.

 * For example, a NSData object returned from NSNetservice's addresses method.

 * 

 * If you have an existing struct sockaddr you can convert it to a NSData object like so:

 * struct sockaddr sa  -> NSData *dsa = [NSData dataWithBytes:&remoteAddr length:remoteAddr.sa_len];

 * struct sockaddr *sa -> NSData *dsa = [NSData dataWithBytes:remoteAddr length:remoteAddr->sa_len];

**/

– (BOOL)connectToAddress:(NSData *)remoteAddr error:(NSError **)errPtr;

 

這個把sockaddr封裝到data中,sockaddr中有地址和端口,一直沒有用過這個

 

 

 

/**

 * This method is the same as connectToAddress:error: with an additional timeout option.

 * To not time out use a negative time interval, or simply use the connectToAddress:error: method.

**/

– (BOOL)connectToAddress:(NSData *)remoteAddr withTimeout:(NSTimeInterval)timeout error:(NSError **)errPtr;

 

 

 

/**

 * Disconnects immediately. Any pending reads or writes are dropped.

 * If the socket is not already disconnected, the onSocketDidDisconnect delegate method

 * will be called immediately, before this method returns.

 * 

 * Please note the recommended way of releasing an AsyncSocket instance (e.g. in a dealloc method)

 * [asyncSocket setDelegate:nil];

 * [asyncSocket disconnect];

 * [asyncSocket release];

**/

– (void)disconnect;

 

立即斷開連接

 

 

 

 

/**

 * Disconnects after all pending reads have completed.

 * After calling this, the read and write methods will do nothing.

 * The socket will disconnect even if there are still pending writes.

**/

– (void)disconnectAfterReading;

 

 

 

 

 

/**

 * Disconnects after all pending writes have completed.

 * After calling this, the read and write methods will do nothing.

 * The socket will disconnect even if there are still pending reads.

**/

– (void)disconnectAfterWriting;

 

 

 

 

 

/**

 * Disconnects after all pending reads and writes have completed.

 * After calling this, the read and write methods will do nothing.

**/

– (void)disconnectAfterReadingAndWriting;

 

 

 

/**

 * Returns the local or remote host and port to which this socket is connected, or nil and 0 if not connected.

 * The host will be an IP address.

**/

– (NSString *)connectedHost;

– (UInt16)connectedPort;

 

– (NSString *)localHost;

– (UInt16)localPort;

 

 

 

 

 

/**

 * Returns the local or remote address to which this socket is connected,

 * specified as a sockaddr structure wrapped in a NSData object.

 * 

 * See also the connectedHost, connectedPort, localHost and localPort methods.

**/

– (NSData *)connectedAddress;

– (NSData *)localAddress;

 

 

 

/////////////////////  delegate////////////////////

 

 

 

 

 

/**

 * In the event of an error, the socket is closed.

 * You may call "unreadData" during this call-back to get the last bit of data off the socket.

 * When connecting, this delegate method may be called

 * before"onSocket:didAcceptNewSocket:" or "onSocket:didConnectToHost:".

**/

– (void)onSocket:(AsyncSocket *)sock willDisconnectWithError:(NSError *)err;

 

 

 

 

 

/**

 * Called when a socket disconnects with or without error.  If you want to release a socket after it disconnects,

 * do so here. It is not safe to do that during "onSocket:willDisconnectWithError:".

 * 

 * If you call the disconnect method, and the socket wasn't already disconnected,

 * this delegate method will be called before the disconnect method returns.

**/

– (void)onSocketDidDisconnect:(AsyncSocket *)sock;

 

 

 

 

 

/**

 * Called when a socket accepts a connection.  Another socket is spawned to handle it. The new socket will have

 * the same delegate and will call "onSocket:didConnectToHost:port:".

**/

– (void)onSocket:(AsyncSocket *)sock didAcceptNewSocket:(AsyncSocket *)newSocket;

 

 

 

 

 

/**

 * Called when a new socket is spawned to handle a connection.  This method should return the run-loop of the

 * thread on which the new socket and its delegate should operate. If omitted, [NSRunLoop currentRunLoop] is used.

**/

– (NSRunLoop *)onSocket:(AsyncSocket *)sock wantsRunLoopForNewSocket:(AsyncSocket *)newSocket;

 

 

 

 

 

/**

 * Called when a socket is about to connect. This method should return YES to continue, or NO to abort.

 * If aborted, will result in AsyncSocketCanceledError.

 * 

 * If the connectToHost:onPort:error: method was called, the delegate will be able to access and configure the

 * CFReadStream and CFWriteStream as desired prior to connection.

 *

 * If the connectToAddress:error: method was called, the delegate will be able to access and configure the

 * CFSocket and CFSocketNativeHandle (BSD socket) as desired prior to connection. You will be able to access and

 * configure the CFReadStream and CFWriteStream in the onSocket:didConnectToHost:port: method.

**/

– (BOOL)onSocketWillConnect:(AsyncSocket *)sock;

 

 

 

 

 

/**

 * Called when a socket connects and is ready for reading and writing.

 * The host parameter will be an IP address, not a DNS name.

**/

– (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port;

 

 

 

 

 

/**

 * Called when a socket has completed reading the requested data into memory.

 * Not called if there is an error.

**/

– (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag;

 

 

 

 

 

/**

 * Called when a socket has read in data, but has not yet completed the read.

 * This would occur if using readToData: or readToLength: methods.

 * It may be used to for things such as updating progress bars.

**/

– (void)onSocket:(AsyncSocket *)sock didReadPartialDataOfLength:(CFIndex)partialLength tag:(long)tag;

 

 

 

 

 

/**

 * Called when a socket has completed writing the requested data. Not called if there is an error.

**/

– (void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag;

 

 

 

/**

 * Called when a socket has written some data, but has not yet completed the entire write.

 * It may be used to for things such as updating progress bars.

**/

– (void)onSocket:(AsyncSocket *)sock didWritePartialDataOfLength:(CFIndex)partialLength tag:(long)tag;

 

 

 

 

 

/**

 * Called if a read operation has reached its timeout without completing.

 * This method allows you to optionally extend the timeout.

 * If you return a positive time interval (> 0) the read's timeout will be extended by the given amount.

 * If you don't implement this method, or return a non-positive time interval (<= 0) the read will timeout as usual.

 * 

 * The elapsed parameter is the sum of the original timeout, plus any additions previously added via this method.

 * The length parameter is the number of bytes that have been read so far for the read operation.

 * 

 * Note that this method may be called multiple times for a single read if you return positive numbers.

**/

– (NSTimeInterval)onSocket:(AsyncSocket *)sock

  shouldTimeoutReadWithTag:(long)tag

                   elapsed:(NSTimeInterval)elapsed

                 bytesDone:(CFIndex)length;

 

 

 

 

 

/**

 * Called if a write operation has reached its timeout without completing.

 * This method allows you to optionally extend the timeout.

 * If you return a positive time interval (> 0) the write's timeout will be extended by the given amount.

 * If you don't implement this method, or return a non-positive time interval (<= 0) the write will timeout as usual.

 * 

 * The elapsed parameter is the sum of the original timeout, plus any additions previously added via this method.

 * The length parameter is the number of bytes that have been written so far for the write operation.

 * 

 * Note that this method may be called multiple times for a single write if you return positive numbers.

**/

– (NSTimeInterval)onSocket:(AsyncSocket *)sock

 shouldTimeoutWriteWithTag:(long)tag

                   elapsed:(NSTimeInterval)elapsed

                 bytesDone:(CFIndex)length;

 

 

 

 

 

/**

 * Called after the socket has successfully completed SSL/TLS negotiation.

 * This method is not called unless you use the provided startTLS method.

 * 

 * If a SSL/TLS negotiation fails (invalid certificate, etc) then the socket will immediately close,

 * and the onSocket:willDisconnectWithError: delegate method will be called with the specific SSL error code.

**/

– (void)onSocketDidSecure:(AsyncSocket *)sock;

 

 

//////////////////// 例子/////////////////

 

 

初始化

 

    socket=[[AsyncSocket alloc]initWithDelegate:self];

    [socket acceptOnPort:3000 error:nil];

    connectedSockets=[[NSMutableArray alloc]initWithCapacity:1];

 

代理

 

-(void)onSocket:(AsyncSocket *)sock didAcceptNewSocket:(AsyncSocket *)newSocket

{

    [connectedSockets addObject:newSocket];

    

}

-(void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port

{

   // NSLog(@"peer host -> %@",[sock connectedAddress]);

    NSString *welcomeMsg = @"hello message";

    NSData *welcomeData = [welcomeMsg dataUsingEncoding:NSUTF8StringEncoding];

    [sock writeData:welcomeData withTimeout:-1 tag:1000];

    [sock readDataWithTimeout:1000 tag:2000];

}

-(void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag

{

    NSLog(@"read data");

    NSLog(@" string ->> %@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding] );

}

 

-(void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag

{

    NSLog(@"write data");

}

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *