Cocoa touch 如何知道我的客户端iOS应用程序是否已连接到服务器?
我按下按钮连接到服务器(TCP),但我不知道它是否连接。。 以下是该部分代码:Cocoa touch 如何知道我的客户端iOS应用程序是否已连接到服务器?,cocoa-touch,networking,client-server,cfnetwork,Cocoa Touch,Networking,Client Server,Cfnetwork,我按下按钮连接到服务器(TCP),但我不知道它是否连接。。 以下是该部分代码: [使用cfstream自连接到服务器:msg portNo:50000] if(readStream && writeStream) { NSString *newText = [[NSString alloc] initWithFormat:@"Connected!! :)"]; statusText.text = newText;
[使用cfstream自连接到服务器:msg portNo:50000]代码>
if(readStream && writeStream)
{
NSString *newText = [[NSString alloc] initWithFormat:@"Connected!! :)"];
statusText.text = newText;
[newText release];
pingButton.hidden = NO;
}
else
{
NSString *newText = [[NSString alloc] initWithFormat:@"Connection unsuccessful :("];
statusText.text = newText;
[newText release];
}
即使服务器处于脱机状态,我也始终会收到“Connected!!:)”:s虽然您没有提供足够的信息,但我建议您将其用于HTTP、TCP和UDP。如果建立了连接,将触发回调方法
我不得不说,我对CFNetwork的经验非常有限,但对我来说,似乎您只是在测试流对象是否存在(if(readStream&&writeStream)
)
快速查看告诉我,您必须使用CFReadStreamOpen()
打开它,如果该函数确实打开了流,它将返回一个布尔值
if (!CFReadStreamOpen(myReadStream)) {
CFStreamError myErr = CFReadStreamGetError(myReadStream);
// An error has occurred.
if (myErr.domain == kCFStreamErrorDomainPOSIX) {
// Interpret myErr.error as a UNIX errno.
} else if (myErr.domain == kCFStreamErrorDomainMacOSStatus) {
// Interpret myErr.error as a MacOS error code.
OSStatus macError = (OSStatus)myErr.error;
// Check other error domains.
}
}
顺便说一句:
而不是
NSString *newText = [[NSString alloc] initWithFormat:@"Connected!! :)"];
statusText.text = newText;
[newText release];
您只需编写statusText.text=@“Connected!!:)”代码>虽然您没有提供足够的信息,但我建议将其用于HTTP以及TCP和UDP。如果建立了连接,将触发回调方法
我不得不说,我对CFNetwork的经验非常有限,但对我来说,似乎您只是在测试流对象是否存在(if(readStream&&writeStream)
)
快速查看告诉我,您必须使用CFReadStreamOpen()
打开它,如果该函数确实打开了流,它将返回一个布尔值
if (!CFReadStreamOpen(myReadStream)) {
CFStreamError myErr = CFReadStreamGetError(myReadStream);
// An error has occurred.
if (myErr.domain == kCFStreamErrorDomainPOSIX) {
// Interpret myErr.error as a UNIX errno.
} else if (myErr.domain == kCFStreamErrorDomainMacOSStatus) {
// Interpret myErr.error as a MacOS error code.
OSStatus macError = (OSStatus)myErr.error;
// Check other error domains.
}
}
顺便说一句:
而不是
NSString *newText = [[NSString alloc] initWithFormat:@"Connected!! :)"];
statusText.text = newText;
[newText release];
您只需编写statusText.text=@“Connected!!:)”代码>针对使用连接方法的人的解决方案:
CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault,
(CFStringRef) urlStr,
portNo,
&readStream,
&writeStream);
if (readStream && writeStream)
{
CFReadStreamSetProperty(readStream,
kCFStreamPropertyShouldCloseNativeSocket,
kCFBooleanTrue);
CFWriteStreamSetProperty(writeStream,
kCFStreamPropertyShouldCloseNativeSocket,
kCFBooleanTrue);
iStream = (NSInputStream *)readStream;
[iStream retain];
[iStream setDelegate:self];
[iStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
forMode:NSDefaultRunLoopMode];
[iStream open];
oStream = (NSOutputStream *)writeStream;
[oStream retain];
[oStream setDelegate:self];
[oStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
forMode:NSDefaultRunLoopMode];
[oStream open];
}
正在使用
-(void)stream:(NSStream*)stream handleEvent:(NSStreamEvent)streamEvent
像这样:
-(void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent
{
NSString *io;
if (theStream == iStream) io = @">>";
else io = @"<<";
NSString *event;
switch (streamEvent)
{
case NSStreamEventNone:
event = @"NSStreamEventNone";
statusText.text = @"Can not connect to the host!";
break;
case NSStreamEventOpenCompleted:
event = @"NSStreamEventOpenCompleted";
pingButton.hidden = NO;
statusText.text = @"Connected";
break;
case NSStreamEventHasBytesAvailable:
event = @"NSStreamEventHasBytesAvailable";
if (theStream == iStream)
{
//read data
uint8_t buffer[1024];
int len;
while ([iStream hasBytesAvailable])
{
len = [iStream read:buffer maxLength:sizeof(buffer)];
if (len > 0)
{
NSString *output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSASCIIStringEncoding];
NSData *theData = [[NSData alloc] initWithBytes:buffer length:len];
if (nil != output)
{
//do something with data
}
}
}
}
break;
case NSStreamEventHasSpaceAvailable:
event = @"NSStreamEventHasSpaceAvailable";
if (theStream == oStream)
{
//send data
uint8_t buffer[11] = "I send this";
int len;
len = [oStream write:buffer maxLength:sizeof(buffer)];
if (len > 0)
{
NSLog(@"Command send");
[oStream close];
}
}
break;
case NSStreamEventErrorOccurred:
event = @"NSStreamEventErrorOccurred";
statusText.text = @"Can not connect to the host!";
pingButton.hidden = YES;
break;
case NSStreamEventEndEncountered:
event = @"NSStreamEventEndEncountered";
statusText.text = @"Connection closed by the server.";
pingButton.hidden = YES;
[theStream close];
[theStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[theStream release];
theStream = nil;
break;
default:
event = @"** Unknown";
}
NSLog(@"%@ : %@", io, event);
}
-(void)stream:(NSStream*)stream handleEvent:(NSStreamEvent)streamEvent
{
NSString*io;
如果(theStream==IsStream)io=@“>>”;
else io=@“采用连接方法的人的解决方案:
CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault,
(CFStringRef) urlStr,
portNo,
&readStream,
&writeStream);
if (readStream && writeStream)
{
CFReadStreamSetProperty(readStream,
kCFStreamPropertyShouldCloseNativeSocket,
kCFBooleanTrue);
CFWriteStreamSetProperty(writeStream,
kCFStreamPropertyShouldCloseNativeSocket,
kCFBooleanTrue);
iStream = (NSInputStream *)readStream;
[iStream retain];
[iStream setDelegate:self];
[iStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
forMode:NSDefaultRunLoopMode];
[iStream open];
oStream = (NSOutputStream *)writeStream;
[oStream retain];
[oStream setDelegate:self];
[oStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
forMode:NSDefaultRunLoopMode];
[oStream open];
}
正在使用
-(void)stream:(NSStream*)stream handleEvent:(NSStreamEvent)streamEvent
像这样:
-(void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent
{
NSString *io;
if (theStream == iStream) io = @">>";
else io = @"<<";
NSString *event;
switch (streamEvent)
{
case NSStreamEventNone:
event = @"NSStreamEventNone";
statusText.text = @"Can not connect to the host!";
break;
case NSStreamEventOpenCompleted:
event = @"NSStreamEventOpenCompleted";
pingButton.hidden = NO;
statusText.text = @"Connected";
break;
case NSStreamEventHasBytesAvailable:
event = @"NSStreamEventHasBytesAvailable";
if (theStream == iStream)
{
//read data
uint8_t buffer[1024];
int len;
while ([iStream hasBytesAvailable])
{
len = [iStream read:buffer maxLength:sizeof(buffer)];
if (len > 0)
{
NSString *output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSASCIIStringEncoding];
NSData *theData = [[NSData alloc] initWithBytes:buffer length:len];
if (nil != output)
{
//do something with data
}
}
}
}
break;
case NSStreamEventHasSpaceAvailable:
event = @"NSStreamEventHasSpaceAvailable";
if (theStream == oStream)
{
//send data
uint8_t buffer[11] = "I send this";
int len;
len = [oStream write:buffer maxLength:sizeof(buffer)];
if (len > 0)
{
NSLog(@"Command send");
[oStream close];
}
}
break;
case NSStreamEventErrorOccurred:
event = @"NSStreamEventErrorOccurred";
statusText.text = @"Can not connect to the host!";
pingButton.hidden = YES;
break;
case NSStreamEventEndEncountered:
event = @"NSStreamEventEndEncountered";
statusText.text = @"Connection closed by the server.";
pingButton.hidden = YES;
[theStream close];
[theStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[theStream release];
theStream = nil;
break;
default:
event = @"** Unknown";
}
NSLog(@"%@ : %@", io, event);
}
-(void)stream:(NSStream*)stream handleEvent:(NSStreamEvent)streamEvent
{
NSString*io;
如果(theStream==IsStream)io=@“>>”;
否则io=@”什么样的服务器?HTTP?FTP?……或TCP/IP上的什么?如果你的iPhone在按下按钮时开始燃烧或爆炸,它很可能没有连接。但是,没有燃烧的iPhone也可能表明它在水下。并提供代码。我的水晶球丢了。@JustSid ahah@vikingosegundo-deves perceber isto não?jápostei mais info无任何评论。什么类型的服务器?HTTP?FTP?…或TCP/IP上的什么?如果你的iPhone在按下按钮时开始燃烧或爆炸,它很可能没有连接。但是,没有燃烧的iPhone也可能表明它在水下。并提供代码。我的水晶球丢了。@JustSid ah.@Vikingosegundos perceber istoão?jápostei mais info no outro comment..哦,对了,lol,所以连接是TCP,我连接了[self-connectToServerUsingCFStream:msg portNo:50000];。这些回调方法,这就是我想知道的lol(顺便问一下,我如何使用标记'code'呢?)ups!它实际上是我用来连接服务器的CFStreamCreatePairWithSocketToHost
。嗯..我环顾四周,也许能帮上忙(我有一个类似的代码,是别人写的,但没有用..):如果套接字连接失败,则请求的CFReadStreamRef和CFWriteStreamRef对象中的一个或两个都为NULL。我现在要尝试一下。我从未成功使用过CFNetwork。我尝试过……AsyncSocket是CFNetwork*周围的一个薄层,它将为您提供简单易用的类和回调方法,使您的生活更加轻松.当我说的太多的时候,我的意思是MUUUCH.hum..好的@vikingosegundo,我一直在避免它,但我要检查一下。我会发布一些反馈。thksoh right lol所以连接是TCP,我连接了[self-ConnecttoServer UsingCFstream:msg portNo:50000];。这些回调方法,这就是我想知道的lol(我如何使用标签'code'顺便说一下?)ups!它实际上是我用来连接服务器的CFStreamCreatePairWithSocketToHost
。嗯..我环顾四周,也许能帮上忙(我有一个类似的代码,是别人写的,但没有用..):如果套接字连接失败,则请求的CFReadStreamRef和CFWriteStreamRef对象中的一个或两个都为NULL。我现在要尝试一下。我从未成功使用过CFNetwork。我尝试过……AsyncSocket是CFNetwork*周围的一个薄层,它将为您提供简单易用的类和回调方法,使您的生活更加轻松.当我说的太多的时候,我是指MUUUCH.嗯..好的@vikingosegundo,我一直在避免它,但我会检查一下。我会发布一些反馈。谢谢