Socket使用教程——AsyncSocket

我用的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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值