问题标签 [nsnetservice]

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 投票
0 回答
1152 浏览

objective-c - Bonjour:使用服务名称和类型在 iOS/Objective-C 中发布 NSNetService

我已经看到NSNetService可以发布一个 Bonjour 服务,设置服务名称和服务类型。我愿意:

现在,当我查看像TildeSoft 的 Bonjour Browser这样的服务浏览器时,我可以看到发布的 NetService 如下所示:

在此处输入图像描述

我可以看到我servicename在服务类型下有命名服务myservicetype._tcp.

那么如何发布一个Bonjour名称类似于AirTunes类型的网络服务_airport._tcp,我的意思是我只能按类型发布我的服务:myservicetype._tcp.

0 投票
1 回答
316 浏览

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

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

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

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

0 投票
1 回答
310 浏览

ios - 了解 bonjour 服务的状态

我正在使用NSNetServiceNSNetServiceBrowser在网络上发布和扫描 Bonjour 服务。实施工作正常,服务在网络上找到并且它们能够通信。我目前正在尝试了解框架的生命周期以及到目前为止我所拥有的:

如果我在适配器开启的情况下启动服务,就会发生这种情况。现在我需要随时了解该服务是否在网络上被积极宣传;也就是说,如果其他设备能够找到它。所以我通过关闭 Wi-Fi 适配器来测试它:

然后我重新打开适配器:

问题是打开或关闭适配器绝对没有区别,所以我无法寻找模式。有没有其他方法可以捕捉这些事件?

编辑:它变得最糟糕。即使我在两个适配器都关闭(飞行模式)的情况下启动服务netServiceDidPublish:仍然会被调用。到目前为止,似乎netServiceDidNotPublish:仅在我尝试注册同一服务两次时才被调用。这对我来说非常违反直觉;也许服务已发布到适配器,但没有发布到网络,因此这些回调非常具有误导性。在这一点上,我无法知道该服务在网络上是否可见。

0 投票
0 回答
126 浏览

ios - NSNetServiceBrowser 无法“偶尔”找到 Apple TV

NSNetServiceBrowser用来查找NSNetService过度连接Apple TVbonjour现在我的代码几乎每次都能正常工作。但是每隔一段时间(10 次中的 1 次)无法NSNetServiceBrowser找到或花费大量时间来找到它。NSNetServiceApple TV

一旦NSNetServiceBrowser无法检测到Apple TV,我必须重新启动,Apple TV然后一切都开始正常工作。

我无法理解问题是什么以及重新启动如何Apple TV解决它。因此,我正在寻找任何指导或建议来确定问题所在。

苹果电视的代码:

iOS设备代码:

更新:当我尝试两个 iOS 设备之间的连接时,它永远不会发生。在这种情况下,我获得了 100/100 次连接。但是一旦我介绍了 Apple TV,我就开始遇到那些找不到电视的场合。

0 投票
1 回答
361 浏览

swift - 在 swift NSNetService 类中如何使用 getInoutStream 发送数据

目前我正在开发一个程序,在该程序中我使用 NSNetService 类连接两个 IOS 设备。我能够连接两个设备,但我不知道如何使用 getInoutStream 函数发送数据。有没有小伙伴可以帮帮我。

0 投票
1 回答
1274 浏览

objective-c - 来自 NSNetService 的 Swift IP 地址

我可以在我的 Swift 项目中使用 Objective-C 代码从 NSNetService 获取 IP 地址。是否有 Swift 代码可以做同样的事情(以避免出现桥接头)?否则我会保持现在的方式 - 但希望它可以在 Swift 中完成。

更新的代码有效:

0 投票
0 回答
467 浏览

ios - CocoaAsyncSocket 和 True iOS Peer-to-Peer 文件传输通过 NSNetService 的 includePeerToPeer 设置

我正在尝试创建一个应用程序,该应用程序能够通过我称之为“真正的”点对点网络在 iOS 设备之间传输大文件,即两个设备直接相互连接而无需中间路由器/wi-网络。我已经确定我有三个高级选项:

1) Apple 的 Multipeer Connectivity 库,它可以发现附近的其他设备,还包括发送 Apple 硬币“资源”又名文件的能力。我的原型显示这个框架在发送大文件(200 MB+)方面很糟糕。速度很少突破 200KB/s 并且不可靠。我见过这个框架最快的速度大约是 1 MB/s。其他人的经历似乎反映了我在网上看到的情况。

2)NSNetService的发现服务,除了它的轻松抓取NSInputStreamNSOutputStreams 的能力。将其与该NSNetServices includePeerToPeer属性结合使用,我可以轻松快速地以“真正的”点对点方式连接到设备,并使用这些流通过网络发送数据。这很好,但是处理输入和输出流异常复杂,因为我需要将标头数据(传入文件名、大小、位置等)打包到流中。我在实践中有这个工作,但我对我的实施感到不安,感觉好像我无法涵盖所有​​的基础。从某种意义上说,我觉得我在这里重新发明了轮子。

3) 我的理想解决方案将使用NSNetService' 检测和连接到对等方的能力,就像最后一个解决方案一样,但会实施CocoaAsyncSockets以处理实际的文件传输,允许我使用具有可靠记录的已建立库,这也让我能够逃脱从使用NSInputStreamNSOutputStream.

我在这里遇到的问题是,虽然 CocoaAsyncSockets 在设备连接到同一网络时工作得很好,但它们无法在真正的对等网络上相互连接,大概是因为它们可以理解地看不到对方正常的以太网接口。看来真正的点对点的东西使用Apple的awdl接口,我在开发者论坛上读到的不能像普通接口一样使用(我尝试在连接套接字时指定该接口,它不起作用)。

我知道这很模糊,但是有人对我有什么建议吗?Apple 开发人员论坛上的一位开发人员在相关主题中提到了一些关于从使用NSNetServicewhen using提供的套接字创建我自己的套接字的内容publishWithOptions:NSNetServiceListenForConnections,但他没有提供太多信息,我似乎无法弄清楚这将如何工作.

0 投票
4 回答
6492 浏览

ios - Swift 3 如何解析 NetService IP?

只是在 swift 3 中尝试 Bonjour

这是我的代码,我可以接收委托

这是我的结果

netServiceDidResolveAddress 服务名称 Webber 的 Mac mini 类型 _myapp._tcp.,端口 5678,地址可选([<1002162e c0a80205 00000000 00000000>,<1c1e162e 00000000 fe800000 00000000 00bce07ad 24b0040>])

c0a80205 是我要找的 IP => 192.168.2.5

地址是 [Data] ,Apple 说

服务的地址。这是一个 NSData 实例的 NSArray,每个实例都包含一个适合与 connect(2) 一起使用的 struct sockaddr。如果没有为服务解析地址或尚未解析服务,则返回一个空的 NSArray。

我仍然很困惑为什么 Data 不能使用 .btyes ?正如苹果所说“这是一个 NSArray 的 NSData 实例”但我不能像 NSData 一样使用它

以及如何将地址解析为可读的 IP 字符串?

我之前尝试过这个,但没有得到结果,因为我除了......

任何建议都会有所帮助,谢谢

0 投票
1 回答
157 浏览

ios - Bonjour/NSNetService 写入 NSOutputStream 的数据永远不会到达另一端(includesPeerToPeer = true)

我有一个通过 Bonjour/NSNetService 建立点对点连接的 iOS 应用程序。(基于 WiTap 示例代码)

在某些情况下,两台设备在几秒钟后都不会再接收数据,而它们仍然能够写出数据(即没有报告错误)。

写入 NSOutputStream 的数据永远不会到达另一端的 NSInputStream。

奇怪的是,在建立连接后发送和接收工作。几秒钟后它似乎变坏了。

如果我设置 includesPeerToPeer = false 它就不会再发生了。有没有人有同样的问题?我需要使用点对点,因为需要使用蓝牙。

谢谢

0 投票
1 回答
961 浏览

ios - GCDAsyncSocket client/server not working over iOS access point

I have a very simple TCP client/server implementation using GCDAsyncSocket (7.5.0) and I'm using NSNetService for service discovery. It's used only on a local wifi network and it works for 2 years with no problem (just to say : I have a proper use of GCDAsyncSocket).

...Until I tried using a third iOS device as access point providing the wifi network to which the client and server connect.

Same when the third iOS device connects both client and server by sharing its connection via Bluetooth.

The service discovery is OK, but once I get the ip address and port, I can't connect and get this error :

Error Domain=NSPOSIXErrorDomain Code=64 "Host is down" UserInfo={NSLocalizedDescription=Host is down, NSLocalizedFailureReason=Error in connect() function}

I tried restricting to IPv4 and IPv6 (both are provided by the service discovery), I also tried using the ipv6 git branch of the GCDAsyncSocket repository and various parameters.

My primary question is : is establishing a simple TCP connexion over a wifi or bluetooth iOS access point possible, if so how ?

My secondary question is : why does the NSNetService service discovery work and not the simple TCP connection ? I know that the protocols are not comparable but still, it confuses me.