【发布时间】:2014-06-04 20:29:43
【问题描述】:
我正在尝试在 iPhone 之间创建一个简单的多人回合制游戏。现在我要做的就是将一些字符串传递给我的方法,并让方法通过NSOutputStream 发送字符串。我想我已经使用NSNetServiceBrowser 正确连接了我的NSNetServices。一旦他们连接,我的NSNetServiceDelegate 就会调用netService:didAcceptConnectionWithInputStream:outputStream:,这应该给我我的 i/o NSStream 对。我的方法是这样的:
-(void)netService:(NSNetService *)sender didAcceptConnectionWithInputStream:(NSInputStream *)inputStream outputStream:(NSOutputStream *)outputStream{
[self.myNet getInputStream:&inputStream outputStream:&outputStream];
self.inStream = inputStream;
self.outStream = outputStream;
[self.inStream setDelegate:self];
[self.inStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[self.inStream open];
}
我想我已经正确设置了 NSInputStream。我还有一个 NSStream 的代表,它正在实现stream:handleEvent:
看起来像这样:
-(void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode{
NSInputStream *inStream = (NSInputStream *)aStream;
BOOL shouldClose = NO;
switch(eventCode) {
case NSStreamEventEndEncountered:
shouldClose = YES;
// If all data hasn't been read, fall through to the "has bytes" event
if(![inStream hasBytesAvailable]) break;
case NSStreamEventHasBytesAvailable: ; // We need a semicolon here before we can declare local variables
uint8_t *buffer;
NSUInteger length;
BOOL freeBuffer = NO;
// The stream has data. Try to get its internal buffer instead of creating one
if(![inStream getBuffer:&buffer length:&length]) {
// The stream couldn't provide its internal buffer. We have to make one ourselves
buffer = malloc(BUFFER_LEN * sizeof(uint8_t));
freeBuffer = YES;
NSInteger result = [inStream read:buffer maxLength:BUFFER_LEN];
if(result < 0) {
// error copying to buffer
break;
}
length = result;
}
// length bytes of data in buffer
if(freeBuffer) free(buffer);
break;
case NSStreamEventErrorOccurred:
// some other error
shouldClose = YES;
break;
case NSStreamEventHasSpaceAvailable:
break;
case NSStreamEventNone:
break;
case NSStreamEventOpenCompleted:
break;
}
if(shouldClose){
[inStream close];
}
}
我从:this page 获取了该代码。在该代码中,aStream 应该是 self.inStream。我查看了描述如何处理 NSOutputStream 的页面,但它们似乎都不适合像我这样的初学者。我有几个问题。首先,我如何设置一个方法,将数据传入(NSData 或者NSString)并通过self.outStream 发送出去。我更喜欢解释代码的答案,而不是仅仅给我。其次,我应该在netService:didAcceptConnectionWithInputStream:outputStream: 中打开我的两个流,我还应该在scheduleInRunLoop NSOutputStreamself.outStream` 中打开我的两个流吗?最后,我做错了吗?
感谢您的回答。这也是我的第一个问题,因此欢迎任何建设性的批评。
【问题讨论】:
标签: ios cocoa-touch nsstream