我用的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
下载源码,把工具类拉入工程可直接使用。