关于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
- 关于AsyncScoket开发中的问题
- 关于JMS开发中的问题
- 关于开发中的命名问题
- 关于开发中的AppbarLayout问题
- 关于项目开发中的一些问题
- 关于VC开发中的函数调用问题
- 关于项目开发中的一些问题
- 关于WP开发中的xml问题
- 关于开发环境中的charset问题
- 关于软件开发中的多语言问题
- 关于项目开发中的习惯问题
- 关于ssh开发中的no session问题
- 关于字节对齐问题在通信程序中的开发经验
- Android开发googleMap+GPS定位中的关于Criteria一知半解问题
- Android开发googleMap+GPS定位中的关于Criteria一知半解问题
- 关于flex开发中的跨域访问问题
- 关于NPAPI开发过程中的几点问题
- Android开发:关于Android Settings中的八个问题
- tomorrow-theme
- 【无中生有】---10---API接口日志存储设计与实现设计
- canvas 画图扇形
- Http 协议
- 测试图片
- 关于AsyncScoket开发中的问题
- opengles 2.0简介及相对1.1的变化
- 八D锁存器74HC573中文资料
- 2015百度之星资格赛1002
- activemq学习日志 2015.5.26
- 使用 emu8086 学习汇编
- seajs之config函数
- 相
- leetcode 日经贴,Cpp code -Contains Duplicate