WiTapに似たアプリを作成しています(ただし、多くのデバイスを接続するため)。問題は次のとおりです。アプリケーションがデバイスを接続しているようです(テーブルビューコントローラーに表示されます。の代理人はNSInput/OutputStream
、両方のストリームが開いていると言いますが、パケットを送信するとでNSOutputStream
反対側のデバイスの関数よりも呼び出されNSInputStream
ません。(NSStreamEventHasBytesAvailible
- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode)
これが接続と送受信を行っているコードです...
//Service was resolved
- (void)netServiceDidResolveAddress:(NSNetService *)netService
{
//Get the streams from NSNetService
NSInputStream *inStream = nil;
NSOutputStream *outStream = nil;
[netService getInputStream:&inStream outputStream:&outStream];
[inStream setDelegate:self];
[inStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
[inStream open];
[outStream setDelegate:self];
[outStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
[outStream open];
[self.inStreams addObject:inStream];
[self.outStreams addObject:outStream];
//Add NSNetService between connected devices
[self.resolvedServices addObject:netService];
[self updateUI];
}
//event handling
- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode
{
switch (eventCode) {
case NSStreamEventHasBytesAvailable:
{
NSMutableData *inBuffer = [[NSMutableData alloc] init];
NSInputStream *inStream = (NSInputStream *)aStream;
uint8_t buffer[3];
NSInteger len = 0;
NSInteger packetNumber = 0;
len = [inStream read:buffer maxLength:3];
if(len > 0) {
[inBuffer appendBytes:buffer length:len];
[inBuffer getBytes:&packetNumber length:len];
[self.delegate stream:inStream didReceivePacketNumber:[NSNumber numberWithInteger:packetNumber]];
}
}
break;
case NSStreamEventHasSpaceAvailable:
if ([aStream isKindOfClass:[NSOutputStream class]])
NSLog(@"NSStream \"%@\" has space availible",aStream);
break;
case NSStreamEventOpenCompleted:
if ([aStream isKindOfClass:[NSInputStream class]])
NSLog(@"NSInputStream opened");
else if ([aStream isKindOfClass:[NSOutputStream class]])
NSLog(@"NSOutputStream opened");
break;
case NSStreamEventErrorOccurred:
NSLog(@"NSStream \"%@\" occurred an error: %@",aStream,[aStream streamError]);
break;
case NSStreamEventEndEncountered:
NSLog(@"Stream \"%@\" has been closed",aStream);
[aStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
[aStream close];
NSUInteger index = 0;
if ([aStream isKindOfClass:[NSOutputStream class]]) {
index = [self.outStreams indexOfObject:aStream];
[self.outStreams removeObject:aStream];
[self.inStreams removeObjectAtIndex:index];
} else if ([aStream isKindOfClass:[NSInputStream class]]) {
index = [self.inStreams indexOfObject:aStream];
[self.inStreams removeObject:aStream];
[self.outStreams removeObjectAtIndex:index];
}
[self.availibleServices removeObjectAtIndex:index];
[self.resolvedServices removeObjectAtIndex:index];
break;
default:
break;
}
}
//sending
//Data pushing into NSStreams
- (void)sendData:(NSData *)data toStream:(NSOutputStream *)aStream
{
if ([aStream hasSpaceAvailable]) {
NSLog(@"%i",[aStream write:[data bytes] maxLength:[data length]]);
}
}
Instruments(ネットワークのもの)を使用してプロジェクトをデバッグしようとしました。パケットは送受信されますが、イベントは発生しません。ご協力ありがとうございました。誰かが望むなら、私はプロジェクト全体を送るのに問題はありません...