bonjour-http 0.7.8

bonjour-http 0.7.8

Satoshi_Nakajima 维护。



  • Satoshi Nakajima

bonjour-http

这个库使得在 Apple 设备(Mac、iPhone、iPad 和 Apple TV)之间使用 Bonjour 连接,并同时使用 HTTP 作为应用层协议变得简便。

它还提供了一个 http-call 包装器,允许客户端异步地从服务器端调用的特定函数并接收结果。

// Client-side
connection.call("greeting", params: ["message": "How are you?"]) { (res, json) in
    if res.isSuccess {
        // process the response
        ...
    }
}
// Server-side
func service(_ service: BonjourService, onCall: String, params: [String : Any], 
             socket: GCDAsyncSocket, context: String) {
    switch(onCall) {
    case "greeting":
        service.respond(to: socket, context: context, 
                        result: ["message": "I'm fine, thank you."])
    default:
        // handle error
        ...
    }
}

为什么使用 HTTP?

Bonjour 是一种建立本地网络中设备之间连接的优秀机制,但它没有指定如何发送各种类型的数据,如文本、JSON 数据和图像。使用 HTTP 是合理的,因为 HTTP 不仅在浏览器和 Web 服务器之间广泛使用,而且还在应用和 Web 服务之间使用。

客户端类

BonjourBrowser 允许一个应用程序发现具有特定类型的 Bonjour 服务(NetService 对象),并将它们呈现给用户进行选择(注意:此库没有 UI 代码)。

BonjourConnection 允许一个应用程序在用户选择的 Bonjour 服务之间建立连接。应用程序通过调用其 send(req:callback:) 方法或 call(req:name:params:callback) 方法向连接的服务器发送 HTTP 请求,然后异步接收响应。

BonjourConnectionDelegate 是一个应用程序可能实现的协议,用于接收由 callback 函数未处理的 sendcall 方法的响应。

BonjourRequest 表示一个 HTTP 请求,由应用程序创建并通过已建立的 BonjourConnection 发送。

BonjourResponse 表示从 Bonjour 服务器返回的 HTTP 响应。

服务器类

BonjourService 允许应用程序发布特定类型的 Bonjour 服务。应用程序需要定义一个表示 HTTP 服务器的类,该类实现 BonjourServiceDelegate 协议。

BonjourRequest 表示从客户端应用程序发送的 HTTP 请求。服务器通过 BonjourServiceDelegate 协议的 service:onRequest:socket:context 方法接收它。

BonjourResponse 表示服务器应用程序创建的 HTTP 响应,作为对客户端应用程序发送的 HTTP 请求的响应。

以下是一个示例,它返回根目录("/")的 "Hello World!" 页面。

class SampleHTTPServer : NSObject, BonjourServiceDelegate {
    func service(_ service: BonjourService, onRequest req: BonjourRequest, socket: GCDAsyncSocket, context: String) {
        var res = BonjourResponse(context: context)
        switch(req.path) {
        case "/":
            res.setBody(string: "<html><body>Hello World!</body></html>")
        default:
            res.setBody(string: "<html><body>Page Not Found</body></html>")
            res.statusText = "404 Not Found"
        }
        service.send(responce: res, to: socket)
    }
}

CocoaPods

从这个仓库生成两个 cocoa pods。

仅服务器版本的目的是用于针对 10.14 的 MacOS 应用程序。客户端代码使用 ObservableObject 协议和 @Published 前缀以支持 SwiftUI,该协议可在 MacOS 10.15 及更高版本上使用。