接続方法に従う人々のための解決策:
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に送られます(ただし、ここを含むWebでこれを何度か見たことがあるので、誰が作成者であるかはわかりません)。このコードは私(pingButton、statusText)によって少し変更されました。元のコードが必要な場合は、前述のリンクにアクセスしてください。
Appleデベロッパサイトにもこれに関する情報があります。
私が言ったように、私はウェブ上でこのように見えるものを見たことがありましたが、接続した後に起こることはすべて「自動」であることがわかりました。たとえば、サーバーがで保留になっている場合、はread()
自動的case NSStreamEventHasSpaceAvailable:
に呼び出され、そこにあるすべてのコードが実行されます。
今、私はこの質問に答えたと思います。