面试题答案
一键面试使用 Bonjour 框架搭建 P2P 网络通信的基本步骤:
- 服务发布:
- 创建一个
NSNetService
对象,用于描述要发布的服务。需要指定服务的名称、类型(如_http._tcp
表示 HTTP 服务基于 TCP 协议)、端口号等信息。 - 调用
NSNetService
的publish
方法来发布该服务,使其在本地网络中可见。
- 创建一个
- 服务发现:
- 创建一个
NSNetServiceBrowser
对象,用于浏览本地网络中的服务。 - 设置
NSNetServiceBrowser
的代理(实现NSNetServiceBrowserDelegate
协议),以便在发现新服务或服务状态改变时收到通知。 - 调用
NSNetServiceBrowser
的searchForServicesOfType:inDomain:
方法,开始搜索指定类型和域(通常为本地域@""
)的服务。
- 创建一个
- 连接到服务:
- 当
NSNetServiceBrowser
发现服务时,会调用代理的netServiceBrowser:didFindService:moreComing:
方法。在这个方法中,获取发现的NSNetService
对象。 - 对获取到的
NSNetService
对象调用resolveWithTimeout:
方法,将服务的名称解析为实际的地址和端口等连接信息。 - 解析完成后,会调用代理的
netServiceDidResolveAddress:
方法,在该方法中,可以使用解析得到的地址信息,创建相应的连接(如使用CFStream
等方式创建网络连接)来与服务进行通信。
- 当
Bonjour 主要解决 P2P 通信中的问题:
- 服务发现:Bonjour 使得设备能够自动发现本地网络中其他设备提供的服务,无需用户手动配置服务器地址等信息。这极大地简化了 P2P 网络中设备间相互发现的过程,提高了用户体验。
- 服务注册与发布:设备可以方便地将自己提供的服务注册并发布到本地网络中,让其他设备能够知晓。解决了如何在 P2P 环境下有效地宣告自己的服务,以便其他对等节点能够找到并使用该服务的问题。
- 地址解析:Bonjour 帮助将服务的名称解析为具体的网络地址和端口等连接信息。在 P2P 通信中,由于设备的动态性,直接使用 IP 地址等固定标识可能不太方便,Bonjour 通过名称解析机制,使得设备间可以使用更具描述性和灵活性的服务名称来建立连接。