遵循连接方法的人们的解决方案:
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 *)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);
}
(据我所知!)这篇文章的功劳归于deksa(尽管我不知道谁是创作者,因为我已经在网上见过几次了,包括SO)。如果您希望原始代码转到前面提到的链接,那么我对这段代码(pingButton,statusText)做了一些修改。
Apple Developer Site上也有一些信息。
就像我说过的,我在网上看到了一些类似的东西,但是现在我知道,连接后发生的一切都是“自动的”;例如,如果服务器用read()暂停,则automatically6ѭ将被自动调用,并且其中的所有代码都将运行。
现在我认为这个问题已经回答。