关于AsyncScoket开发中的问题

来源:互联网 发布:软件交流群 编辑:程序博客网 时间:2024/05/17 09:26

最近做的一些项目中都是用socket来进行网络连接,中间也遇到过一些问题,在此分享一些开发中遇到的困难以及解决办法。
scoket不同与AF只用IP和端口就可以进行传输,但是较为麻烦的是传输需要遵循服务器所给出的传输协议的格式来进行,否则就会连接超时等等。
下面直接上代码来看一下:

#import "AsyncSocket.h".h中声明端口和IP@property (nonatomic, strong) AsyncSocket    *socket;       // socket@property (nonatomic, copy  ) NSString       *socketHost;   // socket的Host@property (nonatomic, assign) UInt16         socketPort;    // socket的protenum{    SocketOfflineByServer,// 服务器掉线,默认为0    SocketOfflineByUser,  // 用户主动cut};@interface ViewController ()<AsyncSocketDelegate>{    NSTimer        *connectTimer;}@end@implementation ViewController- (void)viewDidLoad {    [super viewDidLoad];     [self settingSocket];}- (void)settingSocket {    self.socketHost = @"192.255.8.8";// host设定    self.socketPort = 81;// port设定    self.socket.userData = SocketOfflineByUser;    [self cutOffSocket];   // 确保断开后再连,如果对一个正处于连接状态的socket进行连接,会出现崩溃   self.socket.userData = SocketOfflineByServer;   [self socketConnectHost];}- (void)cretadata {    NSDictionary * dic = _sendDic;    NSError *error=nil;    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:&error];    NSString * str = [[NSString alloc]initWithData:jsonData encoding:NSUTF8StringEncoding];    _str1 = str;}-(void)socketConnectHost{    [self cretadata];    self.socket    = [[AsyncSocket alloc] initWithDelegate:self];    NSError *error = nil;    [self.socket connectToHost:self.socketHost onPort:self.socketPort withTimeout:1 error:&error];}#pragma mark  - 连接成功回调-(void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString  *)host port:(UInt16)port{    NSLog(@"socket连接成功");//因为协议中规定需要把data先Gzip压缩再用AES加密并在前面加上4为长度字节发送发送过去//协议都是由服务器来制定的    NSData   *datas  = [_str1 dataUsingEncoding:NSUTF8StringEncoding];//压缩    NSData * GzipData = [Gzip gzipData:datas];    //    //加密    NSData * dara = [GzipData AES128EncryptWithKey:KEY];    Byte * testByte = (Byte *)[dara bytes];    NSInteger i = dara.length;    Byte bytes[i+4];    UInt32 test = (int)i;    NSData *data = [NSData dataWithBytes:&test length:sizeof(test)];    Byte * lenByte = (Byte *)[data bytes];    for (int i = 0; i < 4; i++) {        bytes[i] = lenByte[3-i];    }    for (int i = 4; i < [dara length]+4; i++) {        bytes[i] = testByte[i-4];    }    NSData * d = [[NSData alloc]initWithBytes:&bytes length:i+4];    [self.socket writeData:d withTimeout:-1 tag:0];    [self.socket readDataWithTimeout:-1 tag:0];}-(void)onSocketDidDisconnect:(AsyncSocket *)sock{    NSLog(@"sorry the connect is failure %ld",sock.userData);    if (sock.userData == SocketOfflineByServer) {        // 服务器掉线,重连        [self socketConnectHost];    }    else if (sock.userData == SocketOfflineByUser) {        // 如果由用户断开,不进行重连        return;    }}// 心跳连接-(void)longConnectToSocket{}// 切断socket-(void)cutOffSocket{    self.socket.userData = SocketOfflineByUser;// 声明是由用户主动切断    [self->connectTimer invalidate];    [self.socket disconnect];}//服务器返回的数据-(void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{    NSLog(@"did read data");//收到的数据需要先截取前面四位字节然后再把后面的数据先解密再解压    Byte * testByte = (Byte *)[data bytes];    NSInteger i = data.length;    Byte bytes[i-4];    for (int i = 0; i < data.length-4; i++) {        bytes[i] = testByte[i+4];    }    NSData * dd = [[NSData alloc]initWithBytes:&bytes length:i-4];    NSData * AESstring = [dd AES128DecryptWithKey:KEY];    NSData * AESdata = [Gzip ungzipData:AESstring];    _ReadDic = [NSJSONSerialization JSONObjectWithData:AESdata options:NSJSONReadingMutableContainers error:nil];}

这就是整个socket的连接过程了 如果有不足之处 还请多多指教大笑 谢谢拜访….

0 0
原创粉丝点击