0

我在客户端应用程序和服务器应用程序之间打开两个 NSStreams 对(输入/输出),并且需要将这两个流关联到同一个服务器端对象上。双流方法意味着 didAcceptConnectionWithInputStream 将被调用两次,每次来自客户端的流打开命令。两个打开命令将按顺序执行,一个紧接着另一个。我尝试使用两个打开将一起完成以在服务器端配对它们的事实,但是如果两个不同的客户端尝试同时连接,则肯定存在竞争条件和流混淆问题。

如果有一个键/值对可以在连接到服务时发送,那将是完美的,并且我将发送客户端生成的 GUID 来识别客户端。

通过 IP 地址进行识别虽然是一种可能的解决方案,因为客户端将位于本地网络上(不必遍历 NAT),但使用 NSNetService 实现似乎很复杂。

4

1 回答 1

0

上面评论中的 Paulw11 帮助我整理了选项。我最终通过以下方式解决了这个问题:

我创建了一个类 PendingStream 来充当每个传入流请求(即输入和输出流对)的临时持有者,并将其添加到包含所有 PendingStream 对象的集合中。PendingStream 被设置为流式传输的委托,以便它可以在输入流上接收来自客户端的传入数据。客户端然后发送一个标识符,该标识符也存储为 PendingStream 的一个属性。每次标识符从客户端到达时,PendingStream 都会回调创建它的原始对象(它是委托),以便可以迭代 PendingStreams 集并匹配基于客户端标识符标识的流对。当找到匹配项时,从集合中删除 PendingStream 对象,并将流对重新分配到需要它们的位置。

基于计时器的方法用于确保没有 PendingStream 孤儿(两个匹配的流请求中只有一个到达)。

它比我想要的更复杂和复杂,但效果很好。

于 2015-12-12T16:34:30.587 回答