mat*_*rau 5 sockets objective-c nsstream ios
我在网上搜索了很长时间......我找不到我的问题的答案,所以我决定在这里发帖.我尝试使用NSStream建立与NNTP服务器的连接.
在测试程序中,我打开流并发送消息.delegate-method(stream:handleEvent:)为输出流(NSStreamEventOpenCompleted,NSStreamEventHasSpaceAvailable)调用两次,但从不为输入流调用!
为什么输入流永远不会调用委托?有任何想法吗?
基本上,代码看起来像这样:
初始化和开放流:
CFReadStreamRef tmpiStream;
CFWriteStreamRef tmpoStream;
CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)SERVER, PORT, &tmpiStream, &tmpoStream);
iStream = (__bridge NSInputStream *) tmpiStream;
oStream = (__bridge NSOutputStream *)tmpoStream;
[iStream setDelegate:self];
[oStream setDelegate:self];
[iStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[oStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[iStream open];
[oStream open];
Run Code Online (Sandbox Code Playgroud)
发信息:
NSData *data = [[NSData alloc] initWithData:[messageString dataUsingEncoding:NSASCIIStringEncoding]];
[oStream write:[data bytes] maxLength:[data length]];
Run Code Online (Sandbox Code Playgroud)
接收消息:
-(void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode
{
NSLog(@"EventCode: %i", eventCode);
//switch-case-statement...(using constants - NSStreamEventOpenCompleted...)
}
Run Code Online (Sandbox Code Playgroud)
包含该代码的类继承自NSObjects和implements NSStreamDelegate.(带有ARC的iOS5)
感谢任何帮助!
编辑:我打开像这样的流后我只是尝试了"轮询" - 它正在工作:
while (![iStream hasBytesAvailable])
{}
uint8_t buffer[1024];
int len;
NSString *str = @"";
while ([iStream hasBytesAvailable])
{
len = [iStream read:buffer maxLength:sizeof(buffer)];
if (len > 0)
{
NSString *output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSISOLatin1StringEncoding];
if (output != nil)
{
str = [str stringByAppendingString:output];
}
}
}
NSLog(@"Response: %@", str);
Run Code Online (Sandbox Code Playgroud)
但是,当然,我仍然需要更好的(异步)解决方案;)
您是否让运行循环在默认模式下运行?
尝试检查输入流状态 ( -streamStatus)。
控制台是否记录了任何内容?
您声称为输出流调用了委托方法,但您的NSLog()调用不会记录该流。你确定吗?
__bridge_transfer最后,这是不相关的,但如果您打算将拥有的 Core Foundation 流对象的所有权转移到 ARC,则应该使用强制转换。更好的是,使用 use CFBridgingRelease(),因为它与函数名称中的 Create 具有明显的对称性。除非存在CFRelease()您未显示的调用,否则现有代码正在泄漏这些流。
| 归档时间: |
|
| 查看次数: |
5670 次 |
| 最近记录: |