Swift开发:如何跨机器向另一应用发送类的对象/实例?
MacOS Cocoa应用跨机器传输Swift类对象方案
要实现跨机器传输携带信息的类对象,核心步骤是对象序列化+网络传输+接收端解析,以下是具体实现方案:
1. 序列化类对象
Swift的Codable协议是实现对象与可传输格式(如JSON)互转的便捷方式,先让你的业务类遵循该协议:
import Foundation // 定义携带信息的类,确保所有属性都支持Codable(基本类型、String、Date等默认支持) class BusinessData: Codable { var identifier: Int var content: String var createTime: Date init(identifier: Int, content: String, createTime: Date) { self.identifier = identifier self.content = content self.createTime = createTime } }
将类对象序列化为二进制数据(JSON格式):
// 创建示例对象 let dataToSend = BusinessData(identifier: 1001, content: "跨机器传输测试", createTime: Date()) do { // 序列化对象为JSON数据 let jsonData = try JSONEncoder().encode(dataToSend) // 后续将jsonData通过网络发送 } catch { print("序列化失败:\(error.localizedDescription)") }
2. 选择网络传输方式
根据你的需求,推荐两种常用的MacOS网络传输方案:
方案一:TCP直连(适合实时性要求高的场景)
使用Apple官方的Network框架实现TCP通信,发送端代码:
import Network // 替换为目标机器的IP地址和自定义端口 let targetHost = NWEndpoint.Host("192.168.xxx.xxx") let targetPort = NWEndpoint.Port(rawValue: 9000)! let connection = NWConnection(host: targetHost, port: targetPort, using: .tcp) connection.stateUpdateHandler = { state in switch state { case .ready: // 连接成功,发送序列化后的jsonData connection.send(content: jsonData, completion: .contentProcessed { error in if let error = error { print("数据发送失败:\(error.localizedDescription)") } else { print("数据发送完成") } }) case .failed(let error): print("连接失败:\(error.localizedDescription)") default: break } } // 启动连接 connection.start(queue: DispatchQueue.global())
接收端监听端口并解析数据:
import Network // 监听与发送端一致的端口 let listener = try! NWListener(using: .tcp, on: NWEndpoint.Port(rawValue: 9000)!) listener.newConnectionHandler = { connection in print("收到新连接") connection.stateUpdateHandler = { state in if state == .ready { // 接收数据 connection.receive(minimumIncompleteLength: 1, maximumLength: 1024 * 1024) { data, _, isComplete, error in guard let receivedData = data, isComplete, error == nil else { print("接收数据异常:\(error?.localizedDescription ?? "未知错误")") return } // 反序列化数据为类对象 do { let receivedObject = try JSONDecoder().decode(BusinessData.self, from: receivedData) print("收到对象:id=\(receivedObject.identifier), 内容=\(receivedObject.content)") // 这里调用你的业务代码处理该对象 } catch { print("反序列化失败:\(error.localizedDescription)") } } } connection.start(queue: DispatchQueue.global()) } } // 启动监听 listener.start(queue: DispatchQueue.global())
方案二:HTTP POST请求(适合简单的请求响应场景)
发送端通过URLSession发送POST请求:
import Foundation // 替换为目标机器的HTTP接口地址 guard let targetURL = URL(string: "http://192.168.xxx.xxx:8080/receive-data") else { print("无效的目标地址") return } var request = URLRequest(url: targetURL) request.httpMethod = "POST" request.setValue("application/json", forHTTPHeaderField: "Content-Type") request.httpBody = jsonData let task = URLSession.shared.dataTask(with: request) { _, response, error in if let error = error { print("请求失败:\(error.localizedDescription)") return } if let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 { print("数据发送成功") } } task.resume()
接收端可以用轻量HTTP框架(如Vapor)搭建服务,或原生实现简单HTTP服务器,解析请求体中的JSON数据并转成类对象。
注意事项
- 确保目标机器的防火墙允许指定端口的通信
- 如果类中包含自定义子类型,需让子类型也遵循
Codable协议 - 传输大对象时,可考虑分块传输或使用更高效的序列化方案(如Protobuf)
内容的提问来源于stack exchange,提问作者yash
相关产品推荐
相关产品推荐

