问题标签 [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 回答
2822 浏览

ios - 如何在另一个线程上正确打开和关闭 NSStream

我有一个应用程序在另一个线程上使用 NSStream 连接到服务器。如果用户决定注销,应用程序也会关闭连接。问题是我永远无法在用户断开连接后成功关闭流或线程。下面是关于如何为网络创建线程并尝试关闭流的代码示例:

尝试连接输入流时调用:

任何意见是极大的赞赏。

0 投票
1 回答
2193 浏览

objective-c - iOS 客户端/服务器实现和“操作正在进行中”错误

背景

我一直在通过各种示例代码和经典的Unix 网络编程教科书自学套接字和网络编程,同时尝试将这些知识应用到我现在正在开发的应用程序中。我目前正在处理需要简单的客户端-服务器设置的应用程序的一部分。

现在是这样的(嗯,应该是这样的):

  1. 服务器发布自己NSNetService并使用创建套接字CFSocketCreateWithNative()
  2. 客户端找到服务器NSNetServiceBrowser
  3. 客户端解析发现的服务
  4. 服务器从 CFSocket 获得一个回调,它创建一个类 ( MyConnection) 的新实例来处理连接。连接的读取和写入流通过CFStreamCreatePairWithSocket().
  5. 客户端向服务器发送消息 (@"hi")
  6. 服务器将从客户端接收到的数据发送回客户端(这是我的问题所在)
  7. 客户端在 UIAlertView 中显示字符串

两个问题

  1. 当我尝试让服务器将数据发送回客户端时,我收到“正在进行操作”错误,如下面的连接代码中所述。我相信这是因为NSOutputStream没有可用空间。处理这个问题的最佳方法是什么?我知道它应该等待NSStreamEventHasSpaceAvailable事件,但它似乎没有发生……<br> 编辑:呃……当我收到此错误时,我仅使用 iPhone 模拟器测试应用程序并让它充当服务器和客户,因为我的新公寓还没有互联网:P 使用两个真实设备时似乎不是问题。

  2. 是否可以使这个服务器,使得每个连接对象的数据发送和接收不会阻塞其他连接对象的数据发送和接收?每个新的连接对象是否需要在新的运行循环或线程或类似的东西上?我已经浏览了苹果并发文档,但没有任何东西跳出来......目标是尽可能快地向客户端发送回复,无论有多少其他客户端连接到服务器。
    更新:我考虑只对连接进行排队并一次处理一个,而不是允许与该服务器的并发连接,因为需要发送到每个客户端的数据量非常小。这是最好的决定吗?如果队列中有数百个客户端怎么办?再想一想,这可能是个坏主意,因为在快速的本地网络上建立连接需要一两秒钟,而使用蓝牙则需要更长的时间......我希望得到一些关于这个问题的专家建议 :)

相关代码

注意:APNetService 和 APNetServiceBrowser 类似于 NSNetService 和 NSNetServiceBrowser

服务器代码

连接代码

客户代码

0 投票
1 回答
4579 浏览

iphone - NSStreamEventErrorOccurred 即使网络信号相当强也会触发

我已经实现了NSStream委托。我已经实现了与Witap 应用程序相同的功能

在那,我已经实现了handleEvent委托

在我的客户网站中,他们报告了一个问题

“我们多次尝试向学习者发送消息或同步设备时,她收到以下消息:“Wifi 连接错误。同样的情况发生在 2 个不同的网络上,即使网络信号非常强,它也无法快速恢复。”

不幸的是,我无法在我的站点中重现此问题,并且它在另一个客户端站点中也可以正常工作!!。

关于这个问题的任何线索。对此的任何帮助表示赞赏。

谢谢你。

0 投票
2 回答
2208 浏览

objective-c - 通过 NSStream 发送时数据被截断

好的,所以我整天都在处理这个错误,我想我已经把它缩小到了根本问题。

背景:

我正在开发一个应用程序,该应用程序要求我编写自己的版本,NSNetServiceNSNetServiceBrowser允许在 iOS 5 中通过蓝牙使用 Bonjour。这是一次很棒的冒险,因为在开始这个项目之前我对网络编程一无所知。我从各种示例项目和经典的Unix 网络编程教科书中学到了很多东西。我的实现主要基于 Apple 的DNSSDObjects示例项目。一旦解决了服务,我添加了代码以实际建立设备之间的连接。AnNSInputStream和 anNSOutputStream是通过 获得的CFStreamCreatePairWithSocketToHost( ... )

问题:

我正在尝试通过此连接发送一些数据。数据由一个整数、几个NSStrings和一个NSData用 存档的对象组成NSKeyedArchiver。的大小NSData约为 150kb,因此整个消息的大小约为 160kb。通过连接发送数据后,当我尝试取消归档时出现以下异常...

经过进一步探索,我注意到接收到的数据只有 2kb 左右。消息被截断,从而使存档“难以理解”。

可能相关的代码:

将数据发送到所有连接设备的方法

Peer 类中实际写入数据的方法NSOutputStream

用于处理流事件(“接收”数据)的 NSStreamDelegate 方法

此代码中的缓冲区大小为 32768 b/c,这就是我从中学到的任何示例代码中的内容。它是任意的吗?我尝试将其更改为 200000,认为问题只是缓冲区太小,但它没有改变任何东西.. 我不认为我完全理解发生了什么。

0 投票
1 回答
912 浏览

ios - iOS:如何加载较大文件的一部分进行上传?

我正在使用 ALAsset 的大型实例,并且正在尝试将资产拆分为较小的块以进行上传。

将大文件拆分成更小的块而不将整个文件加载到内存中的好方法是什么?

0 投票
1 回答
1178 浏览

objective-c - NSTimer 未及时触发

我正在尝试连接到给定 IP 地址上的端口。一个问题是,当使用不存在的 IP 地址建立连接时,写入命令(如下所示):

响应时间超过 75 秒。我尝试通过使用以下方法调用启动计时器来处理此问题:

它不会在我定义的 1 秒间隔内调用。

有什么办法可以确保计时器在 1 秒内触发?

0 投票
1 回答
227 浏览

iphone - CFReadStreamCopyError 在 iPad 设备上报告错误

我遇到了一个问题。相同的代码在 iPhone (iOS 5) 和 iPhone/iPad 模拟器上运行良好。但它不适用于 iPad (iOS 5)。我会很感激任何帮助。

这是读取端口代码:

在上面之前,有连接部分代码。

0 投票
2 回答
3510 浏览

objective-c - 通过 NSStream 在 iOS 设备之间发送后解析数据

我有一个应用程序设置为使用NSStreams 通过 TCP 连接在两个 iOS 设备之间发送数据。

发送的数据由两部分组成:

  1. 一个整数,表示即将到来的消息对象的大小
  2. 消息对象,一些NSStrings和一个NSData用 NSKeyedArchiver 编码的对象

问题:

  1. 当 NSData 对象大约为 1.5Mb 时,当我尝试对其进行解码时,我得到一个难以理解的存档异常。当读取消息应该在的位置后面的 4 个字节时,那里是一个大数字,而不是下一条消息的大小。
  2. 当 NSData 对象大约 80Kb 时,成功解码了两条消息,然后我得到了难以理解的存档异常。

似乎数据在某些时候出现了乱序……尽管 TCP 的全部目的是保持它的有序。所以,一定是我的问题!

相关代码

服务器

sendData:传递已使用 NSKeyedArchiver 编码的 Message 对象。它被要求在短时间内收到 100 条消息

客户

streamHasBytes:收集消息片段并将它们附加到 self.buffer。当 self.buffer 的长度大于 self.buffer 前 4 个字节指示的消息长度时,Message 对象被解析...

编辑:

我现在注意到,在第一个消息中的 NSData 对象大约为 1.5Mb 的情况下,对于大约 1.6Mb 的总消息大小,客户端仅收到大约 1.3Mb ......这将解释难以理解的存档错误。为什么不能交付所有数据?

0 投票
0 回答
703 浏览

iphone - 直接使用 NSStream 是否有优势(相对于 CFNetwork、BSD 套接字等)

我熟悉几种不同的 TCP 连接方式(CFNetwork、BSD 套接字等),但我最近发现 NSStream 有“XXXwithURL:”API,它只允许使用 NSStream 进行 TCP 连接。以这种方式创建连接有什么好处吗?

另外,NSStream 和 CFStream 之间有什么联系?看起来它们是免费桥接的,但这是否意味着 NSStream 是建立在 CFStream 之上的?

0 投票
1 回答
1921 浏览

ios - 当应用程序进入后台时关闭 NSStreams

我是 Objective C 和 ios 开发的新手。我通常使用 Java 编写 Android 应用程序,并且总是使用 onPause 调用来关闭我的套接字。但是,当我在 applicationWillResignActive 下调用我的关闭套接字方法时,我与我的流侦听器失去了通信,并且无法关闭输入和输出流。事实上,即使应用程序连接到服务器,两个流的流状态都显示 NSStreamStatusNotOpen 或 0。有任何想法吗?

谢谢

编辑

SocketHandler.m 类中的连接方法: