- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
目前我正在使用 NetServiceBrowser
查找 Bonjour 服务并解析相应的地址和端口。
为了简化我的代码,我偶然发现了 NWBrowser
它似乎提供了一个非常简单的界面来处理 Bonjour 发现。
然而,browseResultsChangedHandler
发回包含枚举案例端点的结果和更改 service
.我试图从结果中获取地址和端口信息,但似乎是 NWEndpoint
必须是枚举类型 .hostPort。
理想情况下,我会使用端点连接到服务器 NWConnection
,但是,我正在使用另一个不处理 NWEndpoint
的库。直接地。
是否有(简单的)方法可以从 NWEndpoint.service
获取地址和端口信息?结果?
import Foundation
import Network
let browser = NWBrowser(for: .bonjour(type: "_http._tcp", domain: ""), using: NWParameters())
browser.browseResultsChangedHandler = { (results, changes) in
print("Results:")
for result in results
{
if case .service(let service) = result.endpoint
{
debugPrint(service)
}
else
{
assert(false, "This nevers gets executed")
}
}
print("Changes:")
for change in changes
{
if case .added(let added) = change
{
if case .service(let service) = added.endpoint
{
debugPrint(service)
}
else
{
assert(false, "This nevers gets executed")
}
}
}
}
browser.start(queue: DispatchQueue.main)
sleep(3)
最佳答案
这个有可能。
首先,在用户实际选择连接之前,您不应尝试获取服务的主机和端口 - 在您的大多数应用程序中,您应该只存储对服务对象的引用,因为 Bonjour 允许服务的主机和端口改变。来自 Bonjour Concepts :
Additionally, services are not tied to specific IP addresses or even host names. […] If clients store the host name (as in most cases they now do), they will not be able to connect if the service moves to a different host.
Bonjour takes the service-oriented view. Queries are made according to the type of service needed, not the hosts providing them. Applications store service instance names, not addresses, so if the IP address, port number, or even host name has changed, the application can still connect. By concentrating on services rather than devices, the user’s browsing experience is made more useful and trouble-free.
browseResultsChangedHandler
中。 .
NWBrowser
好像是开个
NWConnection
到服务并使用它而不是提取地址和端口并手动连接。您可以打开连接,网络框架将处理解析实际主机/端口并连接到服务。
let connection = NWConnection(to: service.endpoint, using: .tcp)
connection.stateUpdateHandler = { state in
switch state {
case .ready:
if let innerEndpoint = connection.currentPath?.remoteEndpoint,
case .hostPort(let host, let port) = innerEndpoint {
print("Connected to", "\(host):\(port)") // Here, I have the host/port information
}
default:
break
}
}
connection.start(queue: .global())
如果您不能使用此网络框架连接,我猜您可以关闭连接(可能需要等待 TCP 停止使用该端口)并将其用于您自己的目的。
NetService
api 来解析服务(尽管我个人还没有让它与手动构建的实例一起使用)或
DNSServiceResolve
.
关于swift - 如何从 NWEndpoint.service 枚举案例解析地址和端口信息(如果可能),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60579798/
我是一名优秀的程序员,十分优秀!