问题标签 [nsstream]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
422 浏览

objective-c - 在等待 NSStream 响应时替换睡眠调用

我制作了一个应用程序,用于NSStream建立与 telnet 服务器的连接。建立连接后,我发送第一个命令。然后我sleep(1);用来让我的应用程序等待。然后发送第二个命令。

问题是整个 GUI 在sleep(). 我知道这不是“暂停”的“完美”方式,我想学习如何正确地做到这一点。我听说了一些好事,NSTimer但我想有一种具体且“简单”的使用方式,以简单地替换我对sleep().

0 投票
1 回答
4198 浏览

objective-c - CFReadStreamRef 与 NSInputStream *

NSInputStream *和之间的区别CFReadStreamRef似乎是第一个是客观的 C 对象,而第二个是本机结构。然而,它们是免费桥接的。

我想实现一个基于网络流的程序。

  • [NSStream getStreamsToHost:port:inputStream:outputStream:]产生NSInputStream *NSOutputStream *. 但是,在 iOS 上,此方法不可用。

    因此,必须在 iOS 上使用CFStreamCreatePairWithSocketToHost 。

    /li>
  • 设置流属性时,使用时并非所有属性都可用NSInputStream *。特别是kCFStreamPropertyShouldCloseNativeSocket确保在关闭相应的流时也关闭套接字会很有趣。

    我是否必须将 转换NSInputStream *为 aCFReadStreamRef才能设置此属性,然后还原转换以设置此类属性?

  • ...

NSInputStream *似乎有多个缺点。它的唯一优势真的是我可以提供它自己的子类,而在这种情况下我不能这样做CFReadStreamRef吗?什么时候应该使用哪种方法?

0 投票
0 回答
272 浏览

tcp - NSStream 每次关闭时都不会调用它的委托

我有几个 NSStreams(进出 TLS)到服务器,我可以通过它们发送和接收数据就好了,但是在没有任何流量的情况下过了一段时间,可能 5 分钟后,连接似乎自行关闭,但我的代表确实没有用 NSStreamEventEndOccurred 调用,我只在尝试发送内容后得到 NSStreamEventErrorOccurred。

首先,连接不应该自行关闭,因为

-app 仍然处于活动状态

-设备未锁定

-它正在使用的wifi不会断开连接

- 远程服务器具有较长的 tcp 生命周期和 SO_KEEPALIVE 标志处于活动状态,iPhone 端在其本机套接字句柄上也处于活动状态。

尽管如此,我更关心为什么我的代表没有被调用而不是我的连接被关闭。

有任何想法吗?

谢谢

0 投票
1 回答
577 浏览

objective-c - 可以将在主线程上调度的打开但不活动的 NSStream 移动到不同的线程吗?

我正在使用(并且必须使用)我没有来源的第三方框架。第三方框架处理创建经过身份验证的客户端/服务器连接并返回一对打开的 NSStream。我面临的挑战是 NSStreams 被安排在主线程上(创建 UI 可能变得无响应的情况 - 我想避免这种情况)。

在从第三方框架传递流时,没有正在进行的网络流量。所以,我想知道我是否可以取消安排和重新安排 NSStreams。

有谁知道是否可以取消安排打开的 NSStream 并将其重新安排在不同线程上的不同运行循环上?这会导致问题吗?那里有任何代码示例吗?

提前致谢!

亚伦

0 投票
1 回答
983 浏览

ios - 是否可以确定与打开的 NSStream 关​​联的 NSRunLoop/NSThread?

我正在使用(并且必须使用)我没有来源的第三方框架。第三方框架处理创建经过身份验证的客户端/服务器连接并返回一对打开的 NSStream。

根据 Apple 的文档,流创建过程是:alloc/init、设置委托、在运行循环中调度和打开。Apple 的文档进一步说:“您永远不应该尝试从与拥有流的运行循环的线程不同的线程访问预定的流。” https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Streams/Articles/ReadingInputStreams.html#//apple_ref/doc/uid/20002273-1001844

流处理过程为:关闭、取消调度、释放。

如果一个人自己创建了一个流,那么很清楚该流是在哪里安排的。如果第三方框架创建了流,则可能不知道流的调度位置。

查看我找到的文档,我没有看到以编程方式确定与打开的 NSStream 关​​联的 NSRunLoop 和 NSThread 的方法。有没有办法在运行时确定这些信息?

0 投票
2 回答
2579 浏览

objective-c - 使用 NSXMLParser initWithStream:没有收到解析器委托方法

我正在处理的基本问题是使用NSStream类来解析传入的增量 XML 数据。数据从来都不是一个完整的 XML 文档,但我想根据套接字可以读取的数量以增量块的形式接收和处理它。

查看文档NSXMLParser,似乎initWithStream:初始化 a 的方法NSXMLParser将是我的问题的完美解决方案。我可以用 a 初始化解析器,NSInputStream然后每当我通过我的套接字接收数据时调用该parse方法,这又应该调用委托。NSXMLParserNSXMLParser

但是,我没有看到任何被调用的委托,我看到的唯一被调用的方法是流委托stream:handleEvent:。Apple 或其他开发人员似乎几乎没有此 API 的示例。关于我做错了什么或如何initWithStream:正确使用的任何想法?

内容解析器.h

内容解析器.m

0 投票
1 回答
6704 浏览

objective-c - NSStream 处理事件给出状态 4

我正在尝试使用 TCP 连接应用程序,并且在 handleEvent 上得到一个 NSStreamEvent“4”。我究竟做错了什么?

我的代码就像,

控制台给出,

当试图向服务器发送消息时。我使用 Mac 的 tcp 测试器应用程序进行了尝试,它工作正常,所以可能不是防火墙问题。设备和模拟器的输出相同。任何帮助将非常感激。

0 投票
1 回答
3887 浏览

ios - 单独线程上基于网络的 NSStream 的好例子?

有谁知道在单独的线程上创建(基于网络的)NSStreams 的简单示例?

我实际上想要做的是取消调度(从主线程)并重新调度(到帮助程序/网络线程)我从第三方框架接收的打开的 NSInputStream 和 NSOutputStream(请参阅Can an open, but inactive, NSStream that是否将主线程上的调度移动到不同的线程?)。到目前为止,没有人回答这个问题,所以我正在尝试自己做这个,看看它是否可以工作。

为了测试什么是可能的,我正在尝试修改这里的代码(其中包括一个 iOS 客户端和一个非常短的基于 python 的服务器 [太棒了!]): http ://www.raywenderlich.com/3932/how-to -create-a-socket-based-iphone-app-and-server

因此,在创建并打开 NSInputStream 和 NSOutputStream 后,我尝试将其移动到辅助线程上。

我遇到的挑战是帮助线程似乎没有响应来自流的委托消息或我通过以下方式发送的任何消息:performSelector:onThread:withObject:waitUntilDone:modes:。我怀疑我在设置帮助线程的 NSRunLoop 时做错了(参见下面的 networkThreadMain)。

因此,[ChatClientViewController viewDidLoad] 现在看起来像:

使用这些实现:

关于什么可能是错的任何想法?提前致谢!

0 投票
2 回答
1784 浏览

iphone - 监控连接状态和处理丢包

我已经实施了一个可行的解决方案,请在下面查看我的评论

您好,感谢您抽出宝贵时间阅读这篇文章!

我正在开发一个应用程序,该应用程序连接到广播自己的 AdHoc WiFi 网络的硬件设备。我能够通过 CFNetwork 与 NSStream 的免费桥接连接到设备、发送字节和接收字节。我正在使用相当“事实上”的流打开代码,并且流委托正在报告 NSStreamEvents。

初始化与设备的连接后,我可以看到输入和输出流都打开(NSStreamEventOpenCompleted),并且由于硬件设备不断发送“HELLO!”,因此输入流上立即有 BytesAvailable(NSStreamEventHasBytesAvailable)。

在 NSStreamEventHasBytesAvailable 的案例事件中,我从 inputStream 读取数据并将其记录为:

正如预期的那样,当我的设备连接时,我有一个恒定的“LOG -- 设备说:xxxx”流。但是,如果我断开设备与电源的连接,我不会收到任何类型的流事件;日志记录只是一起停止。

我试图通过在我的 viewDidLoad 中启动一个 backgroundTimer 来解决这个问题,它每 0.1 秒尝试从 inputStream 中读取。如果无法读取,则布尔值deviceIsConnected设置为FALSE,我会显示一条警报,通知用户他们与设备的连接已断开。

这种方法已被证明是相当不可靠的,也是一种非常不优雅的方式来执行一项看似简单的检测套接字连接关闭的任务。如果我理解正确, NSStream 类本质上是底层 BSD 套接字架构之上的“中间人”或抽象层。

将硬件设备与其电源断开是模拟走出设备板载 WiFi 芯片的范围。这不是“真实世界”的测试,就像您在物理上离开设备一样,您不会突然失去连接;相反,inputStream 接收到的数据会慢慢恶化,从而导致“网络警报”弹出窗口在设备在“已连接”和“未连接”之间跳转时不断闪烁。

我想实现某种 KeepAlive 处理程序,但我缺乏 iPhone / iOS / BSD 套接字的经验严重阻碍了我。如果你们中的任何一个出色的人可以提供一个方法的基本示例(可能在计时器上运行,我认为我在正确的道路上!)可以检测到套接字变得不可用并继续尝试重新建立连接,我将永远感激不尽。我不知疲倦地搜索了谷歌,发现了一些有希望的想法,但都未能成功实施。

CocoaASyncSocket 能否成为我所有问题/挫折的答案?

再次感谢您花时间阅读这篇文章。我希望我已经清楚地解释了我的问题和我想要的解决方案。如果您有任何问题,请随时提出,我会尽力回答。

0 投票
3 回答
5978 浏览

objective-c - NSInputStream 不调用 Delegate (stream:handleEvent:)

我在网上搜索了很长时间......我没有找到我的问题的答案,所以我决定在这里发布。我尝试使用 NSStream 建立与 NNTP 服务器的连接。

在测试程序中,我打开流并发送消息。委托方法 ( stream:handleEvent:) 为输出流 ( NSStreamEventOpenCompleted, NSStreamEventHasSpaceAvailable) 调用了两次,但从为输入流调用!

为什么输入流从不调用委托?有任何想法吗?

基本上,代码如下所示:

初始化和打开流:

发信息:

接收消息:

包含该代码的类继承自 NSObjects 并实现NSStreamDelegate。(带有 ARC 的 iOS5)

感谢您的帮助!

编辑:我只是在打开这样的流后尝试“轮询” - 它正在工作:

但是,可以肯定的是,我仍然需要一个更好的(异步)解决方案;)