下载此文档

ios开发iOSSocket开发.docx


文档分类:IT计算机 | 页数:约15页 举报非法文档有奖
1/15
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/15 下载此文档
文档列表 文档介绍
该【ios开发iOSSocket开发 】是由【泰山小桥流水】上传分享,文档一共【15】页,该文档可以免费在线阅读,需要了解更多关于【ios开发iOSSocket开发 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。ios开发之iOSSocket开发
这个类使用了Singleton,所以永久只有一个实例。没有实例时会自动生成实例,可以在程序中的任何地址调用它。
一般来说,只要跟服务器建立一次连接即可,产生一对stream,分别是outStream和inStream,所
有的数据都经过它们不停地发送和接收。
stream的end意味着连接中断,假如还需要接见服务器的话,得重新连接stream。(也就是重新实
例化一下我这个类)
每次发送和接受的数据包大小需要自己控制,而不是等stream来告诉你这个数据包有多大,由于
stream不会告诉你
控制方法之一:经过增加一个特别的后缀来判断,比方“<EOF>”,每次读到这个组合就以为数据读
完。但是问题很明显,这个只好用于string。
控制方法之二:经过增加一个4字节的前缀来判断长度。这4个byte的byte[]数组,是当前数据
包的长度信息,依据这个信息来读取必定长度的数据。
每次数据收完后,我用了一个取巧的方法来把数据返还给调用stream的函数这个部分需要改
进。
,实现singleton的类
//
//
//CocoaWithLove
//
5.//CreatedbyMattGallagheron20/10/08.
//.
//
//Permissionisgiventousethissourcecodefilewithoutchargeinany
//project,commercialorotherwise,entirelyatyourrisk,withthecondition
//thatanyredistribution(inpartorwhole)ofsourcecodemustretain
//
//appreciatedbutnotrequired.
//
14.
#defineSYNTHESIZE_SINGLETON_FOR_CLASS(classname)\
\
staticclassname*shared##classname=nil;\
\
+(classname*)shared##classname\
{\
***@synchronized(self)\
{\
if(shared##classname==nil)\
{\
shared##classname=[[selfalloc]init];\
}\
}\
\
returnshared##classname;\
}\
\
+(id)allocWithZone:(NSZone*)zone\
{\
***@synchronized(self)\
{\
if(shared##classname==nil)\
{\
shared##classname=[superallocWithZone:zone];\
returnshared##classname;\
}\
}\
\
returnnil;\
}\
\
-(id)copyWithZone:(NSZone*)zone\
{\
returnself;\
}\
\
-(id)retain\
{\
returnself;\
}\
\
-(NSUInteger)retainCount\
{\
returnNSUIntegerMax;\
}\
\
-(void)release\
{\
}\
\
-(id)autorelease\
{\
returnself;\
}
复制代码

#import<Foundation/>
#import<CFNetwork/>
#import<SystemConfiguration/>
#import<netinet/>
#import<arpa/>
6.
***@interfaceStream:NSObject{
NSInputStream*inStream;
NSOutputStream*outStream;
NSMutableData*dataBuffer;
12.
BOOL
_hasEstablished;
13.
id
_currentObject;
14.
int
_numCondition;
15.
16.
BOOL
_isFirstFourBytes;
17.
uint
remainingToRead;
}
+(Stream*)sharedStream;
-(void)requestData:(NSString*)requestStringwhoRequest:(id)currentObjectcondition:(int)numCondition;
-(void)manageData:(NSData*)receivedData;
***@end

#import""
#import""
***@implementationStream
SYNTHESIZE_SINGLETON_FOR_CLASS(Stream);
-(void)startClient
{
_hasEstablished=NO;
11.
CFReadStreamRef
readStream=NULL;
12.
CFWriteStreamRef
writeStream=NULL;
13.
NSString
*server=/*
你的服务器地址,比方我公司服务器地址
[url][/url]*/;
//这里没实用NSStream的getStreamsToHost,是由于真机编译时有黄色提示说不存在这个函数。
15.//固然真机能用,但我担忧上传到APPStore时会被reject,所以就用了更基层的
CFStreamCreatePairWithSocketToHost。
16.//其实一点都不难,相同用的~
CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault,
18.
(CFStringRef)server,
19.
1234,//
服务器接收数据的端口
20.
&readStream,
21.
&writeStream);
22.
23.
if(readStream&&writeStream)
{
inStream=(NSInputStream*)readStream;
outStream=(NSOutputStream*)writeStream;
}
else
{
//ErrorControl
}
}
34.
-(void)closeStreams{
[[PromptViewsharedPromptView]dismissPromptView];
[inStreamclose];
[outStreamclose];
[inStreamremoveFromRunLoop:[NSRunLoopcurrentRunLoop]forMode:NSDefaultRunLoopMode];
[outStreamremoveFromRunLoop:[NSRunLoopcurrentRunLoop]forMode:NSDefaultRunLoopMode];
[inStreamsetDelegate:nil];
[outStreamsetDelegate:nil];
[inStreamrelease];
[outStreamrelease];
inStream=nil;
outStream=nil;
}
48.
-(void)openStreams{
[inStreamretain];
[outStreamretain];
[inStreamsetProperty:NSStreamSocketSecurityLevelSSLv3forKey:NSStreamSocketSecurityLevelKey];
[outStreamsetProperty:NSStreamSocketSecurityLevelSSLv3
forKey:NSStreamSocketSecurityLevelKey];
//不需要SSL的话,下边这行可以去掉。
CFWriteStreamSetProperty((CFWriteStreamRef)outStream,kCFStreamPropertySSLSettings,[NSMutableDictionarydictionaryWithObjectsAndKeys:(id)kCFBooleanFalse,kCFStreamSSLValidatesCertificateChai
n,kCFBooleanFalse,kCFStreamSSLIsServer,nil]);
[inStreamsetDelegate:self];
[outStreamsetDelegate:self];
[inStreamscheduleInRunLoop:[NSRunLoopcurrentRunLoop]forMode:NSDefaultRunLoopMode];
[outStreamscheduleInRunLoop:[NSRunLoopcurrentRunLoop]forMode:NSDefaultRunLoopMode];
[inStreamopen];
[outStreamopen];
}
63.
-(void)stream:(NSStream*)aStreamhandleEvent:(NSStreamEvent)eventCode
{
switch(eventCode){
caseNSStreamEventHasBytesAvailable:
{
(_isFirstFourBytes)//读取前4个字节,算出数据包大小
{
[4];
([inStreamread:bufferLenmaxLength:4]==4)
73.{
=
((bufferLen[0]<<24)&0xff000000)+((bufferLen[1]<<16)&0xff0000)+((bufferLen[2]<<8)&0xff
00)+(bufferLen[3]&0xff);
=NO;
76.}
77.
else
78.
{
79.
[selfcloseStreams];
80.
//ErrorControl
81.
}
}
//依据数据包大小读取数据
{
85.
intactuallyRead;
86.
uint8_t
buffer[32768];//32KB
的缓冲区,缓冲区太小的话会明显影响真机上的通讯
速度
87.
if(!dataBuffer){
88.
dataBuffer=[[NSMutableDataalloc]init];
89.
}
90.
91.
actuallyRead=[inStreamread:buffermaxLength:sizeof(buffer)];
92.
if(actuallyRead==-1){
93.
[selfcloseStreams];
94.
//ErrorControl
95.
}elseif(actuallyRead==0){
96.
//Dosomethingifyouwant
97.
}else{
98.
[dataBufferappendBytes:bufferlength:actuallyRead];
99.
remainingToRead-=actuallyRead;
100.
}
101.
102.
if(remainingToRead==0)
103.
{
104.
_isFirstFourBytes=YES;
105.[selfmanageData:dataBuffer];//数据接收达成,把数据送回调用sream的
函数
106.[dataBufferrelease];
=nil;
108.}
}
break;
}
://连接断开或结束
{
[selfcloseStreams];
break;
}
://没法连接或断开连接
{
119.
if([[aStream
streamError]code])//
确立code不是0有时正常使用时会跳出code
为0
的错误,但其实一点问题都没有,可以连续使用,很奇异
{
121.[selfcloseStreams];
;
}
}
caseNSStreamEventOpenCompleted:
{
_hasEstablished=YES;
break;
}
caseNSStreamEventHasSpaceAvailable:
{
break;
}
caseNSStreamEventNone:
default:
break;
}
}
139.
//判断能否能连接到服务器。这个函数用来判断网络能否连通还好,要真的判断服务器上对应的端口能否可以连接,不是很好用来着
-(BOOL)isServerAvailable{
142.
NSString*addressString=/*
你的服务器地址,比方我公司地址
[url][/url]*/;
143.
if(!addressString){
144.
returnNO;
145.
}
146.
SCNetworkReachabilityRefdefaultRouteReachability=SCNetworkReachabilityCreateWithName(kCFAllocatorDefault,[addressStringUTF8String]);
SCNetworkReachabilityFlagsflags;
149.
BOOLdidRetrieveFlags=SCNetworkReachabilityGetFlags(defaultRouteReachability,&flags);
CFRelease(defaultRouteReachability);
152.
if(!didRetrieveFlags)
{
returnNO;
}
157.
BOOLisReachable=flags&kSCNetworkFlagsReachable;
BOOLneedsConnection=flags&kSCNetworkFlagsConnectionRequired;

ios开发iOSSocket开发 来自淘豆网m.daumloan.com转载请标明出处.

相关文档 更多>>
非法内容举报中心
文档信息
最近更新