AsyncSocket 已完毕,但网页上有错误怎么解决

本帖子已过去太久远了,不再提供回复功能。iOS应用中使用AsyncSocket库处理Socket通信的用法讲解_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
iOS应用中使用AsyncSocket库处理Socket通信的用法讲解
上传于|0|0|暂无简介
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩7页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢CocoaAsyncSocket使用 - 王朝网络 -
分享&&&&&当前位置: &&&&&&&&CocoaAsyncSocket使用&&&  代理的.h文件  //GCDAsyncSocketDelegate执行代理对象#import&Foundation/Foundation.h&#import"CocoaAsyncSocket.h"#import"Public.h"typedefvoid(^DidReadData)(NSDictionary*didReadData);/**  *
GCDAsyncSocketDelegate执行代理对象*/@interface NSObjectGCDAsyncSocket : NSObject&GCDAsyncSocketDelegate&/**  *
接收到数据的处理*/@PRoperty(nonatomic,copy)DidReadData didReadD/**  *
发送的数据
如果添加新键值则需要先开辟内存*/@property(nonatomic,retain)NSMutableDictionary*writeD/**  *
发送链接请求*/-(BOOL)startC/**  *
单例*/+(NSObjectGCDAsyncSocket*)defaultS  @end  .m文件  ////NSObjectGCDAsyncSocket.m//attendance////Created by dgc on 15/7/7.//Copyright (c) 2015年 dgc. All rights reserved.//#import"NSObjectGCDAsyncSocket.h"@implementation NSObjectGCDAsyncSocket  {  
GCDAsyncSocket*  }/**  *
单例  *  *
@return*/+(NSObjectGCDAsyncSocket *)defaultSocket  {//socket只会实例化一次staticNSObjectGCDAsyncSocket* socket=//保证线程安全,defaultSocket只执行一次staticdispatch_once_  
dispatch_once(&once, ^{  
socket=[[NSObjectGCDAsyncSocket alloc] init];  
});  }/**  *
初始化  *  *  *
@return self*/-(instancetype)init  {  
self=[super init];if(self)  
socket=[[GCDAsyncSocket alloc] initWithDelegate:self  
delegateQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0)];  
}  }/**  *
发送链接请求*/-(BOOL)startConnect  {//先确定断开连接再开始链接if(socket.isConnected)  
NSLog(@"主动断开");  
[socket disconnect];  
NSError*  
isSuccess=[socket connectToHost:SocketHost  
onPort:SocketPort  
error:&error];if(error)  
NSLog(@"error.localizedDescription:%@",error.localizedDescription);  
}returnisS  
  }#pragmamark - GCDAsyncSocketDelegate/**  *
链接成功  *  *
@param sock sock实例  *
@param host IP  *
@param port 端口*/-(void)socket:(GCDAsyncSocket *)sock  didConnectToHost:(NSString*)host  
port:(uint16_t)port  {//NSLog(@"%s",__FUNCTION__);//NSLog(sock.isConnected?@"YES":@"NO");//if (sock.isConnected)//{//nsstring上传需要加"\n"分隔符方可上传成功/*[sock writeData:[@"ABCABCABCABCABCABC\n" dataUsingEncoding:NSUTF8StringEncoding]  withTimeout:-1  tag:0];*//*NSDictionary* nsDictionaryUser=@{@"gpsinfo":@"Gpsinfo",  @"pswd":self.passWord,  @"gpstype":@(2015),  @"name":self.name,  };  
NSDictionary* agrement=@{@"vertion":@(1),  
@"type1":@(2),  
@"type2":@(0),  
@"type3":@(0)};*/if([NSJSONSerialization isValidJSONObject:self.writeData])  
{//NSLog(@"isValidJSONObject");NSError*//先转nsdata再转nsstring是为了保证nsdictionary格式不变NSData *nsDataUser=[NSJSONSerialization dataWithJSONObject:self.writeData  
options:NSJSONWritingPrettyPrinted  
error:&error];  
NSString* json=[[NSString alloc] initWithData:nsDataUser  
encoding:NSUTF8StringEncoding];//NSLog(@"nsDictionaryUser:%@",json);json=[json stringByReplacingOccurrencesOfString:@"\n"withString:@""];  
json=[json stringByReplacingOccurrencesOfString:@""withString:@""];  
json=[json stringByAppendingString:@"\n"];//NSLog(@"json:%@",json);[sock writeData:[json dataUsingEncoding:NSUTF8StringEncoding]  
withTimeout:-1tag:0];//保持读取的长连接[sock readDataWithTimeout:-1tag:0];if(error)  
NSLog(@"localizedDescription:%@",[error localizedDescription]);  
NSLog(@"localizedFailureReason:%@",[error localizedFailureReason]);  
}//}}/**  *
发送数据成功  *  *
@param sock
sock实例  *
@param tag
标记sock*/-(void)socket:(GCDAsyncSocket *)sock  didWriteDataWithTag:(long)tag  {//NSLog(@"didWriteDataWithTag");}/**  *
已经获取到数据  *  *
@param sock sock实例  *
@param data 获取到的数据  *
@param tag
标记sock*/-(void)socket:(GCDAsyncSocket *)sock   didReadData:(NSData*)data  
withTag:(long)tag  {//NSLog(@"%s",__FUNCTION__);NSError* error=  
NSDictionary* json=(NSDictionary*)[NSJSONSerialization JSONObjectWithData:data  
options:NSJSONReadingAllowFragments  
error:&error];  
NSLog([NSJSONSerialization isValidJSONObject:json]?@"is ValidJSONObject":@"is't ValidJSONObject");if(error)  
NSLog(@"socketError1:%@",[error localizedDescription]);  
NSLog(@"socketError2:%@",[error localizedFailureReason]);  
self.didReadData(json);  
[sock disconnect];  
  }/**  *
链接出错  *  *
@param sock sock实例  *
@param err
错误参数*/-(void)socketDidDisconnect:(GCDAsyncSocket *)sock  
withError:(NSError*)err  {//NSLog(@"%s",__FUNCTION__);if(err)  
NSLog(@"socketDidDisconnect:%@",[err localizedDescription]);  
NSLog(@"socketDidDisconnect:%@",[err localizedFailureReason]);  
}//self.didReadData(nil);}  @end  使用  创建对象  
socket=[NSObjectGCDAsyncSocket defaultSocket];  填写发送的数据  socket.writeData=[NSMutableDictionary dictionaryWithDictionary:dictionary];  处理收到的数据  
socket.didReadData=^(NSDictionary*didReadData){.......}开始链接  [socket startConnect];&&&&&今日推荐
&&&&&日版宠物情人2017的插曲,很带节奏感,日语的,女生唱的。
最后听见是在第8集的时候女主手割伤了,然后男主用嘴帮她吸了一下,插曲就出来了。
歌手:Def...老钟家的两个儿子很特别,就是跟其他的人不太一样,魔一般的执着。兄弟俩都到了要结婚的年龄了,不管自家老爹怎么磨破嘴皮子,兄弟俩说不娶就不娶,老父母为兄弟两操碎了心...把牛仔裤磨出有线的破洞
1、具体工具就是磨脚石,下面垫一个硬物,然后用磨脚石一直磨一直磨,到把那块磨薄了,用手撕开就好了。出来的洞啊很自然的。需要猫须的话调几...先来看下敬业福和爱国福
今年春节,支付宝再次推出了“五福红包”活动,表示要“把欠大家的敬业福都还给大家”。
今天该活动正式启动,和去年一样,需要收集“五福”...有时候我们打开冰箱就会闻到一股异味,冰箱里的这种异味是因为一些物质发出的气味的混合体,闻起来让人恶心。 产生这些异味的主要原因有以下几点。
1、很多人有这种习...简介
《极品家丁》讲述了现代白领林晚荣无意回到古代金陵,并追随萧二小姐化名“林三”进入萧府,不料却阴差阳错上演了一出低级家丁拼搏上位的“林三升职记”。...你就是我最爱的宝宝 - 李溪芮
(电视剧《极品家丁》片尾曲)
作词:常馨内
作曲:常馨内
你的眉 又鬼马的挑
你的嘴 又坏坏的笑
上一秒吵闹 下...乌梅,又称春梅,中医认为,乌梅味酸,性温,无毒,具有安心、除热、下气、祛痰、止渴调中、杀虫的功效,治肢体痛、肺痨病。乌梅泡水喝能治伤寒烦热、止吐泻,与干姜一起制...什么是脂肪粒
在我们的脸上总会长一个个像脂肪的小颗粒,弄也弄不掉,而且颜色还是白白的。它既不是粉刺也不是其他的任何痘痘,它就是脂肪粒。
脂肪粒虽然也是由油脂...来源:中国青年报
新的攻击方法不断涌现,黑客几乎永远占据网络攻击的上风,我们不可能通过技术手段杜绝网络攻击。国家安全保障的主要方向是打击犯罪,而不是处置和惩罚...夫妻网络直播“造人”爆红
  1月9日,温岭城北派出所接到南京警方的协查通告,他们近期打掉了一个涉黄直播APP平台。而根据掌握的线索,其中有一对涉案的夫妻主播...如何防止墙纸老化?
(1)选择透气性好的墙纸
市场上墙纸的材质分无纺布的、木纤维的、PVC的、玻璃纤维基材的、布面的等,相对而言,PVC材质的墙纸最不透气...观点一:破日本销售量的“鲜肌之谜” 非日本生产
近一段时间,淘宝上架了一款名为“鲜肌之谜的” 鲑鱼卵巢美容液,号称是最近日本的一款推出的全新护肤品,产品本身所...系腰裙(北宋词人 张先)
惜霜蟾照夜云天,朦胧影、画勾阑。人情纵似长情月,算一年年。又能得、几番圆。
欲寄西江题叶字,流不到、五亭前。东池始有荷新绿,尚小如...关于女人的经典语句1、【做一个独立的女人】
思想独立:有主见、有自己的人生观、价值观。有上进心,永远不放弃自己的理想,做一份自己喜爱的事业,拥有快乐和成就...你想体验机器人性爱吗?你想和性爱机器人结婚吗?如果你想,机器人有拒绝你的权利吗?
近日,第二届“国际人类-机器人性爱研讨会”大会在伦敦金史密斯大学落下帷幕。而...10.土耳其地下洞穴城市
变态指数:★★☆☆☆
这是土耳其卡帕多西亚的一个著名景点,传说是当年基督教徒们为了躲避战争而在此修建。里面曾住着20000人,......据英国《每日快报》报道,一位科学家兼理论家Robert Lanza博士宣称,世界上并不存在人类死亡,死亡的只是身体。他认为我们的意识借助我们体内的能量生存,而且...《我爱狐狸精》 - 刘馨棋
  (电视剧《屏里狐》主题曲)
  作词:金十三&李旦
  作曲:刘嘉
  狐狸精 狐狸仙
  千年修...·&·&·&&&&&&代理的.h文件
//GCDAsyncSocketDelegate执行代理对象#import&Foundation/Foundation.h&#import"CocoaAsyncSocket.h"#import"Public.h"typedefvoid(^DidReadData)(NSDictionary*didReadData);/**
GCDAsyncSocketDelegate执行代理对象*/@interface NSObjectGCDAsyncSocket : NSObject&GCDAsyncSocketDelegate&/**
接收到数据的处理*/@PRoperty(nonatomic,copy)DidReadData didReadD/**
发送的数据
如果添加新键值则需要先开辟内存*/@property(nonatomic,retain)NSMutableDictionary*writeD/**
发送链接请求*/-(BOOL)startC/**
单例*/+(NSObjectGCDAsyncSocket*)defaultS
////NSObjectGCDAsyncSocket.m//attendance////Created by dgc on 15/7/7.//Copyright (c) 2015年 dgc. All rights reserved.//#import"NSObjectGCDAsyncSocket.h"@implementation NSObjectGCDAsyncSocket
GCDAsyncSocket*
@return*/+(NSObjectGCDAsyncSocket *)defaultSocket
{//socket只会实例化一次staticNSObjectGCDAsyncSocket* socket=//保证线程安全,defaultSocket只执行一次staticdispatch_once_
dispatch_once(&once, ^{
socket=[[NSObjectGCDAsyncSocket alloc] init];
@return self*/-(instancetype)init
self=[super init];if(self)
socket=[[GCDAsyncSocket alloc] initWithDelegate:self
delegateQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0)];
发送链接请求*/-(BOOL)startConnect
{//先确定断开连接再开始链接if(socket.isConnected)
NSLog(@"主动断开");
[socket disconnect];
isSuccess=[socket connectToHost:SocketHost
onPort:SocketPort
error:&error];if(error)
NSLog(@"error.localizedDescription:%@",error.localizedDescription);
}returnisS
}#pragmamark - GCDAsyncSocketDelegate/**
@param sock sock实例
@param host IP
@param port 端口*/-(void)socket:(GCDAsyncSocket *)sock
didConnectToHost:(NSString*)host
port:(uint16_t)port
{//NSLog(@"%s",__FUNCTION__);//NSLog(sock.isConnected?@"YES":@"NO");//if (sock.isConnected)//{//nsstring上传需要加"\n"分隔符方可上传成功/*[sock writeData:[@"ABCABCABCABCABCABC\n" dataUsingEncoding:NSUTF8StringEncoding]
withTimeout:-1
tag:0];*//*NSDictionary* nsDictionaryUser=@{@"gpsinfo":@"Gpsinfo",
@"pswd":self.passWord,
@"gpstype":@(2015),
@"name":self.name,
NSDictionary* agrement=@{@"vertion":@(1),
@"type1":@(2),
@"type2":@(0),
@"type3":@(0)};*/if([NSJSONSerialization isValidJSONObject:self.writeData])
{//NSLog(@"isValidJSONObject");NSError*//先转nsdata再转nsstring是为了保证nsdictionary格式不变NSData *nsDataUser=[NSJSONSerialization dataWithJSONObject:self.writeData
options:NSJSONWritingPrettyPrinted
error:&error];
NSString* json=[[NSString alloc] initWithData:nsDataUser
encoding:NSUTF8StringEncoding];//NSLog(@"nsDictionaryUser:%@",json);json=[json stringByReplacingOccurrencesOfString:@"\n"withString:@""];
json=[json stringByReplacingOccurrencesOfString:@""withString:@""];
json=[json stringByAppendingString:@"\n"];//NSLog(@"json:%@",json);[sock writeData:[json dataUsingEncoding:NSUTF8StringEncoding]
withTimeout:-1tag:0];//保持读取的长连接[sock readDataWithTimeout:-1tag:0];if(error)
NSLog(@"localizedDescription:%@",[error localizedDescription]);
NSLog(@"localizedFailureReason:%@",[error localizedFailureReason]);
发送数据成功
@param sock
@param tag
标记sock*/-(void)socket:(GCDAsyncSocket *)sock
didWriteDataWithTag:(long)tag
{//NSLog(@"didWriteDataWithTag");}/**
已经获取到数据
@param sock sock实例
@param data 获取到的数据
@param tag
标记sock*/-(void)socket:(GCDAsyncSocket *)sock
didReadData:(NSData*)data
withTag:(long)tag
{//NSLog(@"%s",__FUNCTION__);NSError* error=
NSDictionary* json=(NSDictionary*)[NSJSONSerialization JSONObjectWithData:data
options:NSJSONReadingAllowFragments
error:&error];
NSLog([NSJSONSerialization isValidJSONObject:json]?@"is ValidJSONObject":@"is't ValidJSONObject");if(error)
NSLog(@"socketError1:%@",[error localizedDescription]);
NSLog(@"socketError2:%@",[error localizedFailureReason]);
self.didReadData(json);
[sock disconnect];
@param sock sock实例
@param err
错误参数*/-(void)socketDidDisconnect:(GCDAsyncSocket *)sock
withError:(NSError*)err
{//NSLog(@"%s",__FUNCTION__);if(err)
NSLog(@"socketDidDisconnect:%@",[err localizedDescription]);
NSLog(@"socketDidDisconnect:%@",[err localizedFailureReason]);
}//self.didReadData(nil);}
socket=[NSObjectGCDAsyncSocket defaultSocket];
填写发送的数据
socket.writeData=[NSMutableDictionary dictionaryWithDictionary:dictionary];
处理收到的数据
socket.didReadData=^(NSDictionary*didReadData){.......}开始链接
[socket startConnect];&&&&&  免责声明:本文仅代表作者个人观点,与王朝网络无关。王朝网络登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。&&&&&&为你推荐&&&&&&转载本文&UBB代码&HTML代码复制到剪贴板...&更多内容··········&&&&&&&&&频道精选&&&王朝女性&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&王朝分栏&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&王朝编程&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&王朝导购&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&王朝其他&&|&&|&&|&&|&&|&&|&&&&2005-&&版权所有&iOS Socket编程 - Asyncsocket (转)_IOS开发_ThinkSAAS
iOS Socket编程 - Asyncsocket (转)
iOS Socket编程 - Asyncsocket (转)
内容来源: 网络
iPhone的标准推荐是CFNetwork 库编程,其封装好的开源库是 cocoa AsyncSocket库,用它来简化CFNetwork的调用,它提供了异步操作
主要特性有:
队列的非阻塞的读和写,而且可选超时。你可以调用它读取和写入,它会当完成后告知你自动的socket接收。如果你调用它接收连接,它将为每个连接启动新的实例,当然,也可以立即关闭这些连接委托(delegate)支持。错误、连接、接收、完整的读取、完整的写入、进度以及断开连接,都可以通过委托模式调用基于run loop的,而不是线程的。虽然可以在主线程或者工作线程中使用它,但你不需要这样做。它异步的调用委托方法,使用NSRunLoop。委托方法包括socket的参数,可让你在多个实例中区分自包含在一个类中。你无需操作流或者socket,这个类帮你做了全部支持基于IPV4和IPV6的TCP流
加入:AsynSocket.h .m与AsynUdpSocket.h .m四个文件 及CFNetwork.framework
#import "AsyncSocket.h"
HelloiPhoneViewController : UIViewController {
UITextField
AsyncSocket * asyncS
@property (retain, nonatomic) IBOutlet UITextField *textF
- (IBAction) buttonPressed: (id)
- (IBAction) textFieldDoneEditing: (id)
在需要联接地方使用connectToHost联接服务器
其中initWithDelegate的参数中self是必须。这个对象指针中的各个Socket响应的函数将被ASyncSocket所调用.initWithDelegate把将当前对象传递进去,这样只要在当前对象方法实现相应方法
asyncSocket = [[AsyncSocket alloc] initWithDelegate:self];
NSError *err =
if(![asyncSocket connectToHost:host on:port error:&err])
NSLog(@"Error: %@", err);
关于NSData对象
无论SOCKET收发都采用NSData对象.它的定义是 /library/mac /#documentation/Cocoa/Reference/Foundation/Classes/NSData_Class/Reference/Reference.html
NSData主要是带一个(id)data指向的数据空间和长度 length.
NSString 转换成NSData 对象
NSData* xmlData = [@"testdata" dataUsingEncoding:NSUTF8StringEncoding];
NSData 转换成NSString对象
NSString *result = [[NSString alloc] initWithData:data
encoding:NSUTF8StringEncoding];
AsyncSocket
方法来发送数据,它有如下定义
- (void)writeData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)
以下是一个实例语句.
NSData* aData= [@"test data" dataUsingEncoding: NSUTF8StringEncoding];
[sock writeData:aData withTimeout:-1 tag:1];
在onSocket重载函数,有如定义采用是专门用来处理SOCKET的发送数据的:
-(void)onSocket(AsyncSocket *)sock didWriteDataWithTag:(long)tag
NSLog(@"thread(%),onSocket:%p didWriteDataWithTag:%d",[[NSThread currentThread] name],
sock,tag);
接收Socket数据.
在onSocket重载函数,有如定义采用是专门用来处理SOCKET的接收数据的.
-(void) onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
在中间将其转换成NSString进行显示.
NSString* aStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"===%@",aStr);
[aStr release];
6、TCP连接读取制定长度的数据
socket连接,可能会读取固定长度的字节
[socket readDataToLength: withTimeout :tag]各方法的解析
-(void)onSocket:(AsyncSocket *)sock willDisconnectWithError:(NSError *)
发生错误,socket关闭,可以在call-back过程调用"unreadData"去取得socket的最后的数据字节,当连接的时候,该委托方法在
onSocket:didAcceptNewSocket: 或者 onSocket:didConnectToHost: 之前调用
-(void)onSocketDidDisconnect:(ASyncSocket *)
当socket由于或没有错误而断开连接,如果你想要在断开连接后release socket,在此方法工作,而在onSocket:willDisconnectWithError 释放则不安全
-(void)onSocket:(AsyncSocket *)sock didAcceptNewSocket:(AsyncSocket *)newS
当产生一个socket去处理连接时调用,此方法会返回 线程上的run-loop 的新的socket和其应处理的委托,如果省略,则使用[NSRunLoop cunrrentRunLoop]
-(BOOL)onSocketWillConnect:(AsyncSocket *)
-(void)onSocket:(AsyncSocket *)sock didConnectToHost :(NSString *)host port:(UINt16)
当socket连接正准备读和写的时候调用,host属性是一个IP地址,而不是一个DNS 名称
-(void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)
当socket已完成所要求的数据读入内存时调用,如果有错误则不调用
-(void)onSocket:(Asyncsocket *)sock didReadPartialDataOfLength:(NSUInteger)partiaLength tag:(long)
当一个socket读取数据,但尚未完成读操作的时候调用,如果使用 readToData: or readToLength: 方法 会发生,可以被用来更新进度条等东西
-(void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)
当一个socket已完成请求数据的写入时候调用
-(void)onSocket:(AsyncSocket *)sock didWritePartialDataOfLength:(NSUInteger)partialLength tag:(long)
当一个socket写入一些数据,但还没有完成整个写入时调用,它可以用来更新进度条等东西
-(NSTimeInterval)onSocket:(AsyncSocket *)sock shouldTimeoutReadWithTag:(long)tag elapsed:(NSTimeInterval)exapsed bytesDone:(NSUInteger)length
使用读操作已超时但还没完成时调用,此方法允许随意延迟超时,如果返回一个正的时间间隔,读取的超时将有一定量的扩展,如果不实现这个方法,或会像往常一样返回一个负的时间间隔,elapsed参数是
原超时的总和,加上先前通过这种方法添加的任何补充, length参数是 读操作到目前为止已读取的字节数, 注意,如果返回正数的话,这个方法可能被一个单独的读取多次调用
-(NSTimeInterval)onSocket:(AsyncSocket *)sock shouldTimeoutWriteWithTag:(long)tag elapsed:(NSTimeInterval)elapsed bytesDone:(NSUInteger)
如果一个写操作已达到其超时但还没完成时调用,同上
-(void)onSocketDidSecure:(AsyncSocket *)
在socket成功完成ssl/tls协商时调用,此方法除非你使用提供startTLS方法时候才调用,
如果ssl/tls是无效的证书,socket将会立即关闭,onSocket:willDisconnectWithError:代理方法竟会与特定的ssl错误代码一起调用
-(BOOL)canSafelySetDelegate
用来查看在改变它之前,是否带有与当前的委托有悬而未决的业务(读/写)。当然,应在安全连接或接受委托之前改变委托
一旦接收或连接方法之一被调用,AsyncSocket实例会被锁定,其他接收/连接方法在没有先断开socket不会被调用
如果尝试失败或超时,这些方法要么返回NO 要么调用 onSocket:willDisconnectWithError: 或 onSockedDidDisconnect
当传入的连接被接受,AsyncSocket调用多个委托方法。这些方法按照时间顺序排列:
1.onSocket:didAcceptNewSocket:
2.onSocket:wantsRunLoopForNewSocket:
3. onSocketWillConnect:
你的服务器的代码将需要保留公认的socket(如果要接受它),最好的地方是要做到这一点可能在onSocket:didAcceptNewSocket:方法
在读和写流已经为新接受的socket设置,onSocket:didConnectToHost:port 方法将在适当的运行循环调用
多线程注意,如果要想通过实施onSocket:wantsRunLoopForNewSocket:,移动另一个新接受的socket去到另一个循环的socket。然后,应该在调用读和写或者startTLS方法前,等待直到onSocket:didConnectToHost:port:方法。否则读和写时间原定于不正确的runloop,混乱可能会随之而来
-(BOOL)acceptOnPort:(UInit16)port error:(NSError **)errP
告诉socket开始听取和接受制定端口上的连接,当一个连接到来的时候,AsyncSocket实例将调用各种委托方法,socket将听取所有可用的接口(wifi,以太网等)
-(BOOL)connectToHost:(NSString *)hostname onPort:(UInt16)port error :(NSError **)errP
连接给定的主机和端口,主机hostname可以是域名或者是Ip地址
-(BOOL)connectToAddress:(NSData *)remoteAddr error:(NSError *)errP
连接到一个给定的地址,制定一个sockaddr结构包裹住一个NSData对象,例如,NSData对象从NSNetService的地址方法返回,如果有一个现有的sockaddr结构,可以将它转换到一个NSData对象,像这样: struct sockaddr sa
-& NSData *dsa = [NSData dataWithBytes:&remoteAddr length:remoteAddr.sa_len]; struct sockaddr *sa -& NSData *dsa = [NSData dataWithBytes:remoteAddr length:remoteAddr-&sa_len];
立即断开,任何未处理的读或写都将被丢弃
如果socket还没有断开,在这个方法返回之前,onSocketDidDisconnect 委托方法将会被立即调用
注意推荐释放AsyncSocket实例的方式:
[asyncSocket setDelegate:nil];
[asyncSocket disconnect];
[asyncSocket release];
-(void)disconnectAfterR
在已经完成了所有悬而未决的读取时 断开,在调用之后,读取和写入方法将无用,socket将断开 即使仍有待写入
- (NSString *)connectedH
- (UInt16)connectedP
- (NSString *)localH
- (UInt16)localP
返回本地和远程主机和端口给连接的socket,如果没有连接会返回nil或0,主机将会是一个IP地址
-(NSData *)connectedAddress
-(NSData *)localAddresss
返回本地和远程的地址给连接的socket,指定一个socketaddr结构包裹在一个NSData对象
readData和writeData方法不会是block(它们是异步的)
当读完成 onSocket:didReadData:withTag: 委托方法时调用
当写完成 onSocket:didWriteDataWithTag: 委托方法时调用
可以选择任何读/写操作的超时设置(为了不超时,使用负时间间隔。)
如果读/写操作超时,相应的 onSocket:shouldTimeout...委托方法被调用去选择性地允许我们去延长超时
超时后,onSocket:willDisconnectWithError: 方法被调用,紧接着是 onSocketDidDisconnect
tag是为了方便,可以使用它作为数组的索引、步数、state id 、指针等
-(void)readDataWithTimeout:(NSTimeInterval)tiemout tag:(long)
读取socket上第一次成为可用的字节,如果timeout值是负数的,读操作将不使用timeout
- (void)readDataWithTimeout:(NSTimeInterval)timeout buffer:(NSMutableData *)buffer bufferOffset:(NSUInterger)offset tag:(long)
读取socket上第一次成为可用的字节
字节将被追加到给定的字节缓冲区,从给定的偏移量开始
如果需要,给定的缓冲区大小将会自动增加
如果timeout值是负数的,读操作将不使用timeout
如果缓冲区为空,socket会为我们创建一个缓冲区
如果bufferOffset是大于给定的缓冲区的长度,该方法将无用,委托将不会被调用
如果你传递一个缓冲区,当AsyncSocket在使用它的时候你不能以任何方式改变它
完成之后,onSocket:didReadData:withTag 返回的数据将是一个给定的缓冲区的子集
也就是说,它将会被引用到被追加的给定的缓冲区的字节
-(void)readDataToLength:(NSUInterger)length withTimeout:(NSTimeInterval)timeout tag:(long)
读取给定的字节数,如果length为0,方法将无用,委托将不会被调用
-(void)readDataToLength:(NSUInteger)length withTimeout:(NSTimeInterval)tiemout buffer:(NSMutableData *)buffer bufferOffset:(NSUInteger) offset tag:(long)
读取给定的字节数,在给定的偏移开始,字节将被追加到给定的字节缓冲区
-(void)readDataToData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)
读取字节直到(包括)传入的作为分隔的"data"参数
如果传递0或者0长度的数据,"data"参数,该方法将无用,委托将不会被调用
从socket读取一行,使用"data"参数作为行的分隔符 (如HTTP的CRLF)
注意,此方法不是字符集,因此,如果一个分隔符出现,它自然可以作为进行编码的一部分,读取将提前结束
-(void)readDataToData:(NSData *)data withTimeout:(NSTimeInterval)timeout buffer:(NSMutableData *)buffer bufferOffset:(NSUInteger) offset tag:(long)
读取字节直到(包括)传入的作为分隔的“data”参数,在给定的偏移量开始,字节将被追加到给定的字节缓冲区。
从socket读取一行,使用"data"参数作为行的分隔符(如HTTP的CRLF)
-(void)writeData:(NSData *)data withTimeout:(NSTimeInterval) timeout tag:(long)
将data写入socket,当完成的时候委托被调用
- (float)progressOfReadReturningTag:(long *)tag bytesDone:(NSUInteger *)done total:(NSUInteger *)
- (float)progressOfWriteReturningTag:(long *)tag bytesDone:(NSUInteger *)done total:(NSUInteger *)
返回当前读或写的进度,从0.0 到 1.0 或者 如果没有读/写的时候返回Nan(使用isNan来检查)
tag、done、total如果不为空的话,它们将会被填补
- (void)startTLS:(NSDictionary *)tlsS
确保使用ssl/tls连接
这方法可被随时调用,tls握手将会发生在所有悬而未决的读/写完成之后。这紧跟着一个发送依赖 StartTLS消息的协议选项,在排队升级到TLS的同一时间,而不必等待写入完成。在这个方法被调用后,任何读写计划 将会发生在安全链接
对于可能的keys和TLS设置的值是有据可查的
一些可能的keys是:
* - kCFStreamSSLLevel
* - kCFStreamSSLAllowsExpiredCertificates
* - kCFStreamSSLAllowsExpiredRoots
* - kCFStreamSSLAllowsAnyRoot
* - kCFStreamSSLValidatesCertificateChain
* - kCFStreamSSLPeerName
* - kCFStreamSSLCertificates
* - kCFStreamSSLIsServer
如果你传递空或者空字典,将使用默认的字典
默认设置将检查以确保由签署可信的第三方证书机构和没有过期的远程连接的证书
然而,它不会验证证书上的名字,除非你给它一个名字,通过kCFStreamSSLPeerName键去验证
这对安全的影响是重要的理解
想象一下你正试图创建一个到的安全连接,但因为一个被攻击的DNS服务器,所以你的socket被定向到
如果你只是使用默认设置, 有一个有效的证书
默认设置将无法监测到任何问题,因为证书是有效的
在这个特殊的情况下,要妥善保护你的连接,应设置kCFStreamSSLPeerName性质为.
如果事前你不知道对等的名字的远程主机(例如,你不确认它是" or ""),那么你可以使用默认设置来验证证书,然后在获得验证的发行后使用X509Certificate类来验证,X509Certificate类的CocoaAsyncSocket开源项目的一部分
-(void)enablePrebuffering
对于处理readDataToData请求,数据是必须从socket以小增量的方式读取出来的
性能通过允许AsyncSocket去一次性读大块的数据和存储任何一个小的内部缓冲区溢出的东西来大大提高
这被称为预缓冲,就好像一些数据在你要求它之前就可能被读取出来
如果你经常使用readDataToData,使用预缓冲会有更好的性能,尤其是在iphone上
默认的预缓冲状态是由DEFAULT_PREBUFFERING 定义控制的,强烈建议设置其为yes
这方法存在一些预缓冲需要一些不可预见的原因被默认禁用的情况,这时,这种方法存在允许当就绪时,可轻松启用预缓冲
-(BOOL)moveToRunLoop:(NSRunLoop *)runL
当你创建一个AsyncSocket,它被添加到当前线程runloop
对于手动创建的socket,在线程上你打算使用它,它是最容易简单的创建的线程上的socket
当一个新的socket被接受,委托方法 onSocket:wantsRunLoopForNewSocket 会被调用 允许你在一个单独的线程上放置socket,这个工作最好结合在同一个线程池设计
如果,但是,在一个单独的线程上,在之后的时间,你需要移动一个socket,这个方法可以用来完成任务
此方法必须从 当前运行的 线程/runloop 的socket 调用
注意:此方法调用后,所有进一步的方法应该从给定的runloop上调用这个对象
此外,所有委托调用将会发送到给定的runloop
- (BOOL)setRunLoopModes:(NSArray *)runLoopM
- (BOOL)addRunLoopMode:(NSString *)runLoopM
- (BOOL)removeRunLoopMode:(NSString *)runLoopM
允许你配置 socket 使用的 运行循环模式
运行循环模式设置默认是NSRunLoopCommonModes
如果你想你的socket 在其他模式下继续操作,你可能需要添加模式 NSModalPanelRunLoopMode 或者 NSEventTrackingRunLoopMode ,或者你可能只想使用 NSRunLoopCommonModes
可接受的socket将自动 继承相同的运行循环模式就像侦听socket
注意:NSRunLoopCommonModes 定义在10.5,对于之前的版本可使用 kCFRunLoopCommonModes
-(NSArray *)runLoopModes
返回当前正在运行的循环模式的AsyncSocket实例, run loop modes的默认设置是NSDefaultRunLoopMode
-(NSData *)unreadD
一个错误的事件,在 onSocket:willDisconnectWithError: 将会被调用 去读取留在socket上的任何数据
+ (NSData *)CRLFD
各方法的解析
-(void)onSocket:(AsyncSocket *)sock willDisconnectWithError:(NSError *)
发生错误,socket关闭,可以在call-back过程调用"unreadData"去取得socket的最后的数据字节,当连接的时候,该委托方法在
onSocket:didAcceptNewSocket: 或者 onSocket:didConnectToHost: 之前调用
-(void)onSocketDidDisconnect:(ASyncSocket *)
当socket由于或没有错误而断开连接,如果你想要在断开连接后release socket,在此方法工作,而在onSocket:willDisconnectWithError 释放则不安全
-(void)onSocket:(AsyncSocket *)sock didAcceptNewSocket:(AsyncSocket *)newS
当产生一个socket去处理连接时调用,此方法会返回 线程上的run-loop 的新的socket和其应处理的委托,如果省略,则使用[NSRunLoop cunrrentRunLoop]
-(BOOL)onSocketWillConnect:(AsyncSocket *)
-(void)onSocket:(AsyncSocket *)sock didConnectToHost :(NSString *)host port:(UINt16)
当socket连接正准备读和写的时候调用,host属性是一个IP地址,而不是一个DNS 名称
-(void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)
当socket已完成所要求的数据读入内存时调用,如果有错误则不调用
-(void)onSocket:(Asyncsocket *)sock didReadPartialDataOfLength:(NSUInteger)partiaLength tag:(long)
当一个socket读取数据,但尚未完成读操作的时候调用,如果使用 readToData: or readToLength: 方法 会发生,可以被用来更新进度条等东西
-(void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)
当一个socket已完成请求数据的写入时候调用
-(void)onSocket:(AsyncSocket *)sock didWritePartialDataOfLength:(NSUInteger)partialLength tag:(long)
当一个socket写入一些数据,但还没有完成整个写入时调用,它可以用来更新进度条等东西
-(NSTimeInterval)onSocket:(AsyncSocket *)sock shouldTimeoutReadWithTag:(long)tag elapsed:(NSTimeInterval)exapsed bytesDone:(NSUInteger)length
使用读操作已超时但还没完成时调用,此方法允许随意延迟超时,如果返回一个正的时间间隔,读取的超时将有一定量的扩展,如果不实现这个方法,或会像往常一样返回一个负的时间间隔,elapsed参数是
原超时的总和,加上先前通过这种方法添加的任何补充, length参数是 读操作到目前为止已读取的字节数, 注意,如果返回正数的话,这个方法可能被一个单独的读取多次调用
-(NSTimeInterval)onSocket:(AsyncSocket *)sock shouldTimeoutWriteWithTag:(long)tag elapsed:(NSTimeInterval)elapsed bytesDone:(NSUInteger)
如果一个写操作已达到其超时但还没完成时调用,同上
-(void)onSocketDidSecure:(AsyncSocket *)
在socket成功完成ssl/tls协商时调用,此方法除非你使用提供startTLS方法时候才调用,
如果ssl/tls是无效的证书,socket将会立即关闭,onSocket:willDisconnectWithError:代理方法竟会与特定的ssl错误代码一起调用
-(BOOL)canSafelySetDelegate
用来查看在改变它之前,是否带有与当前的委托有悬而未决的业务(读/写)。当然,应在安全连接或接受委托之前改变委托
一旦接收或连接方法之一被调用,AsyncSocket实例会被锁定,其他接收/连接方法在没有先断开socket不会被调用
如果尝试失败或超时,这些方法要么返回NO 要么调用 onSocket:willDisconnectWithError: 或 onSockedDidDisconnect
当传入的连接被接受,AsyncSocket调用多个委托方法。这些方法按照时间顺序排列:
1.onSocket:didAcceptNewSocket:
2.onSocket:wantsRunLoopForNewSocket:
3. onSocketWillConnect:
你的服务器的代码将需要保留公认的socket(如果要接受它),最好的地方是要做到这一点可能在onSocket:didAcceptNewSocket:方法
在读和写流已经为新接受的socket设置,onSocket:didConnectToHost:port 方法将在适当的运行循环调用
多线程注意,如果要想通过实施onSocket:wantsRunLoopForNewSocket:,移动另一个新接受的socket去到另一个循环的socket。然后,应该在调用读和写或者startTLS方法前,等待直到onSocket:didConnectToHost:port:方法。否则读和写时间原定于不正确的runloop,混乱可能会随之而来
-(BOOL)acceptOnPort:(UInit16)port error:(NSError **)errP
告诉socket开始听取和接受制定端口上的连接,当一个连接到来的时候,AsyncSocket实例将调用各种委托方法,socket将听取所有可用的接口(wifi,以太网等)
-(BOOL)connectToHost:(NSString *)hostname onPort:(UInt16)port error :(NSError **)errP
连接给定的主机和端口,主机hostname可以是域名或者是Ip地址
-(BOOL)connectToAddress:(NSData *)remoteAddr error:(NSError *)errP
连接到一个给定的地址,制定一个sockaddr结构包裹住一个NSData对象,例如,NSData对象从NSNetService的地址方法返回,如果有一个现有的sockaddr结构,可以将它转换到一个NSData对象,像这样: struct sockaddr sa
-& NSData *dsa = [NSData dataWithBytes:&remoteAddr length:remoteAddr.sa_len]; struct sockaddr *sa -& NSData *dsa = [NSData dataWithBytes:remoteAddr length:remoteAddr-&sa_len];
立即断开,任何未处理的读或写都将被丢弃
如果socket还没有断开,在这个方法返回之前,onSocketDidDisconnect 委托方法将会被立即调用
注意推荐释放AsyncSocket实例的方式:
[asyncSocket setDelegate:nil];
[asyncSocket disconnect];
[asyncSocket release];
-(void)disconnectAfterR
在已经完成了所有悬而未决的读取时 断开,在调用之后,读取和写入方法将无用,socket将断开 即使仍有待写入
- (NSString *)connectedH
- (UInt16)connectedP
- (NSString *)localH
- (UInt16)localP
返回本地和远程主机和端口给连接的socket,如果没有连接会返回nil或0,主机将会是一个IP地址
-(NSData *)connectedAddress
-(NSData *)localAddresss
返回本地和远程的地址给连接的socket,指定一个socketaddr结构包裹在一个NSData对象
readData和writeData方法不会是block(它们是异步的)
当读完成 onSocket:didReadData:withTag: 委托方法时调用
当写完成 onSocket:didWriteDataWithTag: 委托方法时调用
可以选择任何读/写操作的超时设置(为了不超时,使用负时间间隔。)
如果读/写操作超时,相应的 onSocket:shouldTimeout...委托方法被调用去选择性地允许我们去延长超时
超时后,onSocket:willDisconnectWithError: 方法被调用,紧接着是 onSocketDidDisconnect
tag是为了方便,可以使用它作为数组的索引、步数、state id 、指针等
-(void)readDataWithTimeout:(NSTimeInterval)tiemout tag:(long)
读取socket上第一次成为可用的字节,如果timeout值是负数的,读操作将不使用timeout
- (void)readDataWithTimeout:(NSTimeInterval)timeout buffer:(NSMutableData *)buffer bufferOffset:(NSUInterger)offset tag:(long)
读取socket上第一次成为可用的字节
字节将被追加到给定的字节缓冲区,从给定的偏移量开始
如果需要,给定的缓冲区大小将会自动增加
如果timeout值是负数的,读操作将不使用timeout
如果缓冲区为空,socket会为我们创建一个缓冲区
如果bufferOffset是大于给定的缓冲区的长度,该方法将无用,委托将不会被调用
如果你传递一个缓冲区,当AsyncSocket在使用它的时候你不能以任何方式改变它
完成之后,onSocket:didReadData:withTag 返回的数据将是一个给定的缓冲区的子集
也就是说,它将会被引用到被追加的给定的缓冲区的字节
-(void)readDataToLength:(NSUInterger)length withTimeout:(NSTimeInterval)timeout tag:(long)
读取给定的字节数,如果length为0,方法将无用,委托将不会被调用
-(void)readDataToLength:(NSUInteger)length withTimeout:(NSTimeInterval)tiemout buffer:(NSMutableData *)buffer bufferOffset:(NSUInteger) offset tag:(long)
读取给定的字节数,在给定的偏移开始,字节将被追加到给定的字节缓冲区
-(void)readDataToData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)
读取字节直到(包括)传入的作为分隔的"data"参数
如果传递0或者0长度的数据,"data"参数,该方法将无用,委托将不会被调用
从socket读取一行,使用"data"参数作为行的分隔符 (如HTTP的CRLF)
注意,此方法不是字符集,因此,如果一个分隔符出现,它自然可以作为进行编码的一部分,读取将提前结束
-(void)readDataToData:(NSData *)data withTimeout:(NSTimeInterval)timeout buffer:(NSMutableData *)buffer bufferOffset:(NSUInteger) offset tag:(long)
读取字节直到(包括)传入的作为分隔的“data”参数,在给定的偏移量开始,字节将被追加到给定的字节缓冲区。
从socket读取一行,使用"data"参数作为行的分隔符(如HTTP的CRLF)
-(void)writeData:(NSData *)data withTimeout:(NSTimeInterval) timeout tag:(long)
将data写入socket,当完成的时候委托被调用
- (float)progressOfReadReturningTag:(long *)tag bytesDone:(NSUInteger *)done total:(NSUInteger *)
- (float)progressOfWriteReturningTag:(long *)tag bytesDone:(NSUInteger *)done total:(NSUInteger *)
返回当前读或写的进度,从0.0 到 1.0 或者 如果没有读/写的时候返回Nan(使用isNan来检查)
tag、done、total如果不为空的话,它们将会被填补
PHP开发框架
开发工具/编程工具
服务器环境
ThinkSAAS商业授权:
ThinkSAAS为用户提供有偿个性定制开发服务
ThinkSAAS将为商业授权用户提供二次开发指导和技术支持
让ThinkSAAS更好,把建议拿来。
开发客服微信}

我要回帖

更多关于 已完毕,但网页上有错误 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信