ios - NSStream 不提供任何数据

标签 ios objective-c sockets stream telnet

我正在尝试在 iOS 上编写 telnet 客户端,但无法正确设置流。我认为它们可以工作,但每次触发委托(delegate)方法时我都会得到空缓冲区。

以下是我设置流的方式:

self.manager = [[TelnetManager alloc] init];

CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)[[NSURL URLWithString:@"arda.pp.ru"] host], 7000, &readStream, &writeStream);

NSInputStream *inputStream = (__bridge_transfer NSInputStream *)readStream;
NSOutputStream *outputStream = (__bridge_transfer NSOutputStream *)writeStream;
[inputStream setDelegate:self.manager];
[outputStream setDelegate:self.manager];
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[inputStream open];
[outputStream open];

这是处理事件的管理器上的委托(delegate)方法:

-(void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode
{
    if (eventCode == NSStreamEventHasBytesAvailable) {
        NSLog(@"We got some data over here");
            if(!_data) {
                _data = [NSMutableData data];
            }
            uint8_t buf[1024];
            unsigned int len = 0;
            len = [(NSInputStream *)aStream read:buf maxLength:1024];
        NSLog(@"length - %d", len);
        NSLog(@"buf:%s", buf);
            if(len) {
                [_data appendBytes:(const void *)buf length:len];
                _bytesRead = @([_bytesRead intValue]+len);
            } else {
                NSLog(@"no buffer!");
            }
    }
}

它被触发了,但是缓冲区总是空的并且记录了“无缓冲区”。 我的代码有什么问题?

最佳答案

实际上您的代码没有任何问题。我用它连接到 telnet 服务器并且工作正常。

在您的代码中,当 len 为 0 时记录“无缓冲区”,这意味着已到达缓冲区的末尾。对于 telnet 服务器,这通常意味着服务器断开了您的连接或服务器退出。

关于ios - NSStream 不提供任何数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20435188/

相关文章:

iphone - 如何在延迟后为 popViewController 设置动画?

java - 套接字 InputStream 和 UTF-8

java - 使用超时与 Socket.connect 建立连接

iphone - Universal Ad-Hoc 版本确实安装在 ipad 上,但没有安装在 iphone 上

iphone - 加载完成后,iOS 会显示复选标记

iphone - 暂停/恢复从 iPhone 上传到服务器的文件

ios - 如何根据 UITableView 滚动动态调整 UITableViewCell 的大小?

iphone - 混音控制台应用程序中的多个平移手势

objective-c - 在 objective-c 中是否有命名初始化方法的约定?

java - 通过 C++ 和 Java 之间的 TCP 套接字发送消息