唯一标识连接到NSNetService / NSStream的客户端

时间:2015-12-11 23:24:07

标签: ios cocoa nsnetservice

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

如果在连接到服务时可以发送密钥/值对,那么最好的是,我会发送客户端生成的GUID来识别客户端。

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

1 个答案:

答案 0 :(得分:0)

Paulw11在上面的评论中帮助我对选项进行了分类。我最终以下列方式解决了问题:

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

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

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