• iPhone开发之网络编程 AsyncSocket


    转自 http://www.open-open.com/lib/view/open1338595161095.html

    iphone的CFNetwork编程比较艰深。使用AsyncSocket开源库来开发相对较简单,下面介绍一些简单的使用,并给出一个简单的实现模板,只要添加自己的处理代码就可以使用了。

    官方网站:http://code.google.com/p/cocoaasyncsocket/

    一.项目添加ASyncSocket

      1.下载ASyncSocket库源码

      2.把ASyncSocket库源码加入项目

      3.在项目增加CFNetwork框架

    二.功能介绍

     1.在需要联接地方使用connectToHost联接服务器

    其中initWithDelegate的参数中self是必须。这个对象指针中的各个Socket响应的函数将被ASyncSocket所调用.

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

    NSError *err = nil;

    if(![asyncSocket connectToHost:host on:port error:&err])

    {

         NSLog(@"Error: %@", err);

    }

    2.增加Socket响应事件

       因为initWithDelegate把将当前对象传递进去,这样只要在当前对象方法实现相应方法.

       关于NSData对象

       无论SOCKET收发都采用NSData对象.它的定义是

       NSData主要是带一个(id)data指向的数据空间和长度 length.

       NSString 转换成NSData 对象

       NSData* xmlData = [@"testdata" dataUsingEncoding:NSUTF8StringEncoding];

       NSData 转换成NSString对象

       NSData * data;

       NSString *result = [[NSString alloc] initWithData:data  encoding:NSUTF8StringEncoding];

    3.发送数据

    AsyncSocket  writeData    方法来发送数据,它有如下定义

    - (void)writeData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag;

    以下是一个实例语句.

    NSData* aData= [@"test data" dataUsingEncoding: NSUTF8StringEncoding];

    [sock writeData:aData withTimeout:-1 tag:1];

    4.接收Socket数据.

    在onSocket重载函数,有如定义采用是专门用来处理SOCKET的接收数据的.

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

    在中间将其转换成NSString进行显示.

    NSString* aStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

    NSLog(@"===%@",aStr);

    [aStr release];

    三.实现模板,将直接的代码添加进入就可以使用了

    001 #import "AsyncSocket.h"
    002  
    003 #define theEndTag 255
    004  
    005 @implementation SocketComm
    006  
    007 //初始话,创建socket
    008  
    009 - (id) init
    010  
    011 {
    012  
    013     self = [super init];
    014  
    015     if (self != nil) {
    016  
    017     _sock = [[AsyncSocket alloc] initWithDelegate:self];
    018  
    019     [_sock setRunLoopModes:[NSArray arrayWithObject:NSRunLoopCommonModes]];
    020  
    021     }
    022  
    023     return self;
    024  
    025 }
    026  
    027 //发送数据
    028  
    029 -(void)writeDataOnMainThread:(id)string
    030  
    031 {
    032  
    033     NSData *cmdData = [string dataUsingEncoding:NSUTF8StringEncoding]
    034  
    035     [_sock writeData:data withTimeout:-1 tag:0];
    036  
    037 }
    038  
    039 //打开
    040  
    041 - (NSInteger)SocketOpen:(NSString*)addr port:(NSInteger)port
    042  
    043 {
    044  
    045     if (![_sock isConnected])
    046  
    047     {
    048  
    049     [_sock connectToHost:addr onPort:port withTimeout:timeout error:&err];
    050  
    051     NSLog(@"connect to Host:%@ Port:%d",addr,port);
    052  
    053     }
    054  
    055     return 0;
    056  
    057 }
    058  
    059 //写数据
    060  
    061 - (NSInteger)SocketWrite:(NSString*)cmd level:(NSInteger)level
    062  
    063 {
    064  
    065     if ([_sock isConnected])
    066  
    067     {
    068  
    069     //处理发送数据,加入队列等待发送
    070  
    071     }
    072  
    073     else
    074  
    075     {
    076  
    077     NSLog(@"Offline!");
    078  
    079     }
    080  
    081     return 0;
    082  
    083 }
    084  
    085 //关闭
    086  
    087 - (NSInteger)SocketClose
    088  
    089 {
    090  
    091     if ([_sock isConnected])
    092  
    093     {
    094  
    095     [_sock writeData:Data withTimeout:-1 tag:theEndTag];
    096  
    097     [_sock disconnectAfterReadingAndWriting];
    098  
    099     }
    100  
    101     return 0;
    102  
    103 }
    104  
    105 #pragma mark -
    106  
    107 #pragma mark Delegate
    108  
    109 - (void)onSocket:(AsyncSocket *)sock willDisconnectWithError:(NSError *)err
    110  
    111 {
    112  
    113     NSLog(@"willDisconnectWithError:%@",err);
    114  
    115 }
    116  
    117 - (void)onSocketDidDisconnect:(AsyncSocket *)sock
    118  
    119 {
    120  
    121     NSLog(@"onSocketDidDisconnect");
    122  
    123 }
    124  
    125 - (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port
    126  
    127 {
    128  
    129     NSLog(@"didConnectToHost");
    130  
    131     //这是异步返回的连接成功,
    132  
    133     [sock readDataWithTimeout:-1 tag:0];
    134  
    135 }
    136  
    137 - (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
    138  
    139 {
    140  
    141     NSString *msg = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];
    142  
    143     if(msg)
    144  
    145     {
    146  
    147     //处理受到的数据
    148  
    149     }
    150  
    151     else
    152  
    153     {
    154  
    155     NSLog(@"Error converting received data into UTF-8 String");
    156  
    157     }
    158  
    159     [sock readDataWithTimeout:-1 tag:0];
    160  
    161 }
    162  
    163 - (void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag
    164  
    165 {
    166  
    167     NSLog(@"didWriteDataWithTag:%d",tag);
    168  
    169 }
    170  
    171 @end
  • 相关阅读:
    JavaScript操作符instanceof揭秘
    Linux打开txt文件乱码的解决方法
    Working copy locked run svn cleanup not work
    poj 2299 UltraQuickSort 归并排序求解逆序对
    poj 2312 Battle City 优先队列+bfs 或 记忆化广搜
    poj2352 stars 树状数组
    poj 2286 The Rotation Game 迭代加深
    hdu 1800 Flying to the Mars
    poj 3038 Children of the Candy Corn bfs dfs
    hdu 1983 Kaitou Kid The Phantom Thief (2) DFS + BFS
  • 原文地址:https://www.cnblogs.com/linyawen/p/2638366.html
Copyright © 2020-2023  润新知