Sti*_*Cat 1 networking cocoa-touch client-server cfnetwork
我按下按钮连接到服务器(TCP),但我不知道它是否连接..这是代码的一部分:
[self connectToServerUsingCFStream: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];
}
Run Code Online (Sandbox Code Playgroud)
即使服务器处于脱机状态,我也总是得到"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];
}
Run Code Online (Sandbox Code Playgroud)
正在使用
-(void)stream:(NSStream *)theStream 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);
}
Run Code Online (Sandbox Code Playgroud)
(所有我知道的!)的学分去deksa从这篇文章(虽然我不知道谁是创造者,因为我已经看到了网络上一些这方面的时间,包括位置o SO).如果您希望原始代码转到前面提到的链接,我会稍微修改此代码(pingButton,statusText).
在苹果开发者网站,有一些这方面的信息也是如此.
就像我说的那样,我在网上看到过这样的东西,但现在我明白连接后发生的一切都是"自动的"; 例如,如果服务器处于暂停状态read(),case NSStreamEventHasSpaceAvailable:则会自动调用,并且将运行其中的所有代码.
现在我认为这个问题得到了回答