Socket使用教程——AsyncSocket

来源:互联网 发布:西安软件开发 大专 编辑:程序博客网 时间:2024/06/01 10:00

我用的AsyncSocket,用来做智能家居WiFi通信方面。

1.从git上下载第三方:https://github.com/robbiehanson/CocoaAsyncSocket   

导入AsyncSocket.h, AsyncSocket.m, AsyncUdpSocket.h, AsyncUdpSocket.m文件。

2.封装一个连接类。

DLSSocketConnectTool.h

////  DLSSocketConnectTool.h//  Socket////  Created by dev on 16/2/19.//  Copyright © 2016年 SWALLE. All rights reserved.//#import <Foundation/Foundation.h>#import "Common.h"@protocol DLSSocketConnectToolDelegate <NSObject>@optional/********************连接上WiFi是调用*******************/-(void)didConnect:(AsyncSocket *)socket WithHost:(NSString *)host WithPort:(UInt16)port;/********************断开连接时调用*********************/-(void)didDisconnect:(AsyncSocket *)socket;/********************发送命令成功***********************/-(void)succeedSendMessage:(AsyncSocket *)socket;/********************接收到服务器返回的数据***************/-(void)receivedDataWith:(NSDictionary *)dict;@end@interface DLSSocketConnectTool : NSObject<AsyncSocketDelegate>@property(nonatomic,strong)enum userData;@property(nonatomic, strong)id<DLSSocketConnectToolDelegate>delegate;/*********************单例*****************************/+(instancetype)shareSocket;/*********************连接WiFi*************************/-(void)connectSocket;/*********************断开WiFi*************************/-(void)disconnectSocket;/*********************发送数据**************************/-(void)sendmessage:(NSString *)message;@end
DLSSocketConnectTool.m

////  DLSSocketConnectTool.m//  Socket////  Created by dev on 16/2/19.//  Copyright © 2016年 SWALLE. All rights reserved.//#import "DLSSocketConnectTool.h"@interface DLSSocketConnectTool()/** *  AsyncSocket对象 */@property(nonatomic, strong)AsyncSocket *socket;/** *  连接超时的定时器 */@property(nonatomic, strong)NSTimer *timeoutTimer;/** *  用于心跳的定时器 */@property(nonatomic, strong)NSTimer *heardTimer;@end@implementation DLSSocketConnectTool-(AsyncSocket *)socket{    if (!_socket) {        _socket = [[AsyncSocket alloc] init];    }    return _socket;}#pragma mark -- 单例+(instancetype)shareSocket{    static DLSSocketConnectTool *socketConnect = nil;    static dispatch_once_t onceToken;    dispatch_once(&onceToken, ^{        socketConnect = [[super allocWithZone:NULL] init];    });    return socketConnect;}#pragma mark -- 连接socket-(void)connectSocket{    if (![self.socket isConnected]) {         [self.socket connectToHost:IP onPort:Port error:nil];    }       self.timeoutTimer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(cancleSocketConnect) userInfo:nil repeats:NO];}//连接超时提醒-(void)cancleSocketConnect{    HWLog(@"连接超时");}#pragma mark -- 主动断开连接-(void)disconnectSocket{    [self.socket disconnect];    self.socket.cutUserBool = YES;    }#pragma mark -- 发送数据-(void)sendmessage:(NSString *)message{    [self.socket writeData:[DLStranslateStringToDataTool convertHexStrToData:message] withTimeout:2 tag:1];}#pragma mark -- AsyncSocketDelegate//连接上WiFi时调用- (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port{    self.socket.cutUserBool = NO;    //心跳确保连接正常    self.heardTimer = [NSTimer scheduledTimerWithTimeInterval:30 target:self selector:@selector(heardConnectTimer) userInfo:nil repeats:YES];    [self.heardTimer fire];    //代理传值    [self.delegate didConnect:sock WithHost:host WithPort:port];}//断开连接时调用- (void)onSocketDidDisconnect:(AsyncSocket *)sock{    if (self.socket.cutUserBool == YES) {        return;    }else{        [self connectSocket];    }    }//数据发送成功时调用- (void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag{    }//读取消息成功时调用- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{    NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];    [self.delegate receivedDataWith:dict];   }//心跳检测长连接-(void)heardConnectTimer{    NSString *longConnect = @"socket long connect";    [self.socket writeData:[DLStranslateStringToDataTool convertHexStrToData:longConnect] withTimeout:2 tag:2];}@end

辅助工具:DLStranslateStringToDataTool.h 将string类型转化为NSdata类型 

////  DLStranslateStringToDataTool.m//  Socket////  Created by dev on 16/2/19.//  Copyright © 2016年 SWALLE. All rights reserved.//#import "DLStranslateStringToDataTool.h"@implementation DLStranslateStringToDataTool#pragma mark -- 十六进制转换为NSData数据流+ (NSData *)convertHexStrToData:(NSString *)str {    if (!str || [str length] == 0) {        return nil;    }        NSMutableData *hexData = [[NSMutableData alloc] initWithCapacity:8];    NSRange range;    if ([str length] % 2 == 0) {        range = NSMakeRange(0, 2);    } else {        range = NSMakeRange(0, 1);    }    for (NSInteger i = range.location; i < [str length]; i += 2) {        unsigned int anInt;        NSString *hexCharStr = [str substringWithRange:range];        NSScanner *scanner = [[NSScanner alloc] initWithString:hexCharStr];                [scanner scanHexInt:&anInt];        NSData *entity = [[NSData alloc] initWithBytes:&anInt length:1];        [hexData appendData:entity];                range.location += range.length;        range.length = 2;    }            return hexData;}@end

源码连接地址:http://pan.baidu.com/s/1hrjXAS0

下载源码,把工具类拉入工程可直接使用。

0 0
原创粉丝点击