//news Server
NSInputStream *iNewS;
NSOutputStream *oNewS;
经经验检验 @property(nonatomic,retain)NSInputStream *iNewS;
在重连57次左右,会导致程序飞掉,改成 @property(retain)NSInputStream *iNewS;后则不会导致程序飞,可以N多重连。
不知道如何设置连接超时???//暂时可以考虑,连接之后,设置一个延时函数,到时间发现仍没有连接上,则断开,提示连接超时即可。
- (BOOL)isNetworkReachable{
// Create zero addy
struct sockaddr_in zeroAddress;
bzero(&zeroAddress, sizeof(zeroAddress));
zeroAddress.sin_len = sizeof(zeroAddress);
zeroAddress.sin_family = AF_INET;
// Recover reachability flags
SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress);
SCNetworkReachabilityFlags flags;
BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
CFRelease(defaultRouteReachability);
if (!didRetrieveFlags)
{
return NO;
}
BOOL isReachable = flags & kSCNetworkFlagsReachable;
//BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired;
return isReachable;
}
- (void)getStreamsToHostNamed:(NSString *)hostName
port:(NSInteger)port
inputStream:(NSInputStream **)inputStreamPtr
outputStream:(NSOutputStream **)outputStreamPtr
{
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
assert(hostName != nil);
assert( (port > 0) && (port < 65536) );
assert( (inputStreamPtr != NULL) || (outputStreamPtr != NULL) );
readStream = NULL;
writeStream = NULL;
CFStreamCreatePairWithSocketToHost(NULL,
(CFStringRef) hostName,
port,
((inputStreamPtr != nil) ? &readStream : NULL),
((outputStreamPtr != nil) ? &writeStream : NULL));
if (inputStreamPtr != NULL) {
*inputStreamPtr = [NSMakeCollectable(readStream) autorelease];
}
if (outputStreamPtr != NULL) {
*outputStreamPtr = [NSMakeCollectable(writeStream) autorelease];
}
}
- (BOOL) connectNewsToServerUsingStream:(NSString *)urlStr
portNo: (uint) portNo
{
if (![NSStream isNetworkReachable])
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示"
message:@"没有网络(There is no network!)"
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
[alert release];
return NO;
}
if (![urlStr isEqualToString:@""])
{
NSURL *website = [NSURL URLWithString:urlStr];
if (!website)
{
//NSLog(@"%@ is not a valid URL");
return NO;
}
else
{
[NSStream getStreamsToHostNamed:urlStr
port:portNo
inputStream:&iNewS
outputStream:&oNewS];
[iNewS retain];
[oNewS retain];
//设置代理(回调方法、委托)
[iNewS setDelegate:self];
[oNewS setDelegate:self];
//设置线程,添加线程,创建线程:Runloop顾名思义就是一个不停的循环,不断的去check输入
[iNewS scheduleInRunLoop:[NSRunLoop currentRunLoop]
forMode:NSDefaultRunLoopMode];
[oNewS scheduleInRunLoop:[NSRunLoop currentRunLoop]
forMode:NSDefaultRunLoopMode];
//打开线程
[oNewS open];
[iNewS open];
}
}
return YES;
}
- (void)disConnect
{
//关闭循环
[iNewS removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[oNewS removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
//关闭线程
[iNewS close];
[oNewS close];
//释放
self.iNewS = nil;
self.oNewS = nil;
}
am eventCode是参数,名字可以改动 stream handleEvent是函数名,不可以改动
- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode
{
switch(eventCode)
{
case NSStreamEventHasBytesAvailable:
{
char data[1024*10];
memset(data, 0, 1024*10);
int len = [(NSInputStream *)stream read:buf maxLength:100];
break;
}
case NSStreamEventEndEncountered://连接断开或结束
{
//disconnect 关闭流
//[self alertViewToUser:@"服务器连接断开"];
break;
}
case NSStreamEventErrorOccurred://无法连接或断开连接
{
if([[aStream streamError] code] != 0)//确定code不是0……有时候正常使用时会跳出code为0的错误,但其实一点问题都没有,可以继续使用,很奇怪……
{
//连接断开
}
}
case NSStreamEventOpenCompleted://流已经打开
{
//_hasEstablished = YES;
break;
}
case NSStreamEventHasSpaceAvailable://可以向发送缓存发送数据
{
if (aStream == oNewS )
{
NSLog(@"now can up data");
break;
}
break;
}
case NSStreamEventNone:
default:
break;
}
}