zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    解决cron不执行的问题
    查看crontab运行状态
    php_network_getaddresses: getaddrinfo failed 原因
    UPdate语句
    重磅邀请函来了!首届“腾讯云+社区开发者大会”免费报名!
    Node 框架接入 ELK 实践总结
    只知道ajax?你已经out了
    深入理解苹果系统(Unicode)字符串的排序方法
    附实例!实现iframe父窗体与子窗体的通信
    vue.js的项目实战
  • 原文地址:https://www.cnblogs.com/linyawen/p/2638366.html
Copyright © 2011-2022 走看看