首先导入 GCDAsyncSocket 第三方库
.h部分
#import <Foundation/Foundation.h>
#import "GCDAsyncSocket.h"
#define AFMPOS_SOCKET_BANK_SERVER_IP @"111.17.212.35" //后台服务器IP
#define AFMPOS_SOCKET_BANK_SERVER_PORT 5000 //后台服务器端口号
@interface AFmPosSocketManager : NSObject<GCDAsyncSocketDelegate>
@property(nonatomic,strong) GCDAsyncSocket *AFmPosSocket;
@property (nonatomic, copy) void (^AFmPosSocketRevDataBlock)(NSData * RevData);
- (NSInteger)AFmPosSocketDataTrans:(NSData *)sendData revData:(NSData **)revData;
@end
.m部分
#import "AFmPosSocketManager.h"
@implementation AFmPosSocketManager
@synthesize AFmPosSocket;
NSData *m_AFmPosRevData;
bool m_AFmPosConnectStatus = false;
-(NSInteger) AFmPosSocketDataTrans:(NSData *)sendData revData:(NSData **)revData
{
NSInteger iResult = -1;
//连接socket
iResult = [self AFmPosConnectServer];
if (iResult != AFMPOS_OPERAT_SUC) {
return iResult;
}
if ( m_AFmPosConnectStatus == false) {
return AFMPOS_OPERAT_ERRFAILS;
}
//socket通信
iResult = [self AFmPosSendAndRevData:sendData];
if (iResult != AFMPOS_OPERAT_SUC) {
return iResult;
}
*revData = m_AFmPosRevData;
//断开socket
[AFmPosSocket disconnect];
return AFMPOS_OPERAT_SUC;
}
- (NSInteger)AFmPosConnectServer
{
AFmPosSocket = [[GCDAsyncSocket alloc]initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
NSError *err = nil;
if(![AFmPosSocket connectToHost:AFMPOS_SOCKET_BANK_SERVER_IP onPort:AFMPOS_SOCKET_BANK_SERVER_PORT error:&err])
{
NSLog(@"==========>%@AFmPosConnectServer fail:",err.description);
return AFMPOS_CMD_OPERAT_ERR_CODE_CONNECT_BANK_ERR;
}
NSLog(@"==========>AFmPosConnectServer begin!");
__block dispatch_semaphore_t sem = dispatch_semaphore_create(0);
dispatch_queue_t queue = dispatch_queue_create("StudyBlocks", NULL);
dispatch_async(queue, ^(void) {
self.AFmPosSocketRevDataBlock = ^(NSData * RevData){
m_AFmPosRevData = [[NSData alloc] initWithData:RevData];
dispatch_semaphore_signal(sem);
};
});
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
dispatch_release(sem);
dispatch_release(queue);
return AFMPOS_OPERAT_SUC;
}
-(void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port
{
NSLog(@"==========>Connect To Server Sucess!");
m_AFmPosConnectStatus = true;
[AFmPosSocket readDataWithTimeout:10 tag:0];
if (self.AFmPosSocketRevDataBlock) {
self.AFmPosSocketRevDataBlock(nil);
}
}
- (NSInteger)AFmPosSendAndRevData:(NSData *)sendData
{
NSLog(@"==========>AFmPosSendAndRevData begin!");
//数据打印
Byte *printData = (Byte *)[sendData bytes];
printf("==========>8583 SendData:");
for (int i= 0; i< [sendData length]; i++) {
printf("%02X",printData[i]);
}
printf("\n");
[AFmPosSocket writeData:sendData withTimeout:10 tag:0];
[AFmPosSocket readDataWithTimeout:10 tag:0];
__block dispatch_semaphore_t sem = dispatch_semaphore_create(0);
dispatch_queue_t queue = dispatch_queue_create("StudyBlocks", NULL);
dispatch_async(queue, ^(void) {
self.AFmPosSocketRevDataBlock = ^(NSData * RevData){
m_AFmPosRevData = [[NSData alloc] initWithData:RevData];
dispatch_semaphore_signal(sem);
};
});
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
dispatch_release(sem);
dispatch_release(queue);
return AFMPOS_OPERAT_SUC;
}
//socket 接收数据
-(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
{
Byte *printData = (Byte *)[data bytes];
printf("==========>8583 RevData:");
for (int i= 0; i< [data length]; i++) {
printf("%02X",printData[i]);
}
printf("\n");
//数据处理
//透传数据处理
if (self.AFmPosSocketRevDataBlock) {
m_AFmPosRevData = [[NSData alloc] initWithData:data];
self.AFmPosSocketRevDataBlock(data);
}
[AFmPosSocket readDataWithTimeout:10 tag:0];
}
- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err
{
NSLog(@"==========>Disconnect Server Sucess!%@",err);
m_AFmPosConnectStatus = false;
if (self.AFmPosSocketRevDataBlock) {
self.AFmPosSocketRevDataBlock(m_AFmPosRevData);
}
}
@end
使用方法:
AFmPosSocketManager *m_socketManager = [[AFmPosSocketManager alloc]init];
NSData *recvData;
iResult = [m_socketManager AFmPosSocketDataTrans:sendData revData:&recvData];
文中返回的状态码,可以根据自己的代码自己去定义。