【问题标题】:How can I get a data from socket and make a protobuf file?如何从套接字获取数据并制作 protobuf 文件?
【发布时间】:2019-05-15 10:15:37
【问题描述】:
如何在swift中从socket接收文件并将其转换为swift protobuf?
首先我使用的是 IBM 的蓝色插座。
我尝试以 String 格式接收 protobuf 的大小,然后将其转换为 int,然后我打开一个从服务器获得的大小的缓冲区。
问题是套接字不会填充应有大小的数据。
如何制作固定大小的数据(我以字符串格式获得的大小)并等待它被数据填充然后转换为 protobuf?
还有其他方法吗?
【问题讨论】:
标签:
swift
sockets
protocol-buffers
【解决方案1】:
好吧,经过数月和数天的努力,我找到了正确的方法,而不是使用套接字。
为了向服务器发送和接收 protobuf,他们有一个叫做 BinaryDelimited 的东西。
要从服务器接收 protobuf,您将使用:
BinaryDelimited.parse(messageType: ProtoFile.self, from: inputStream )
ProtoFile.self 是您编译的自定义 protobuf 类。
要将 protobuf 发送到您将使用的服务器:
BinaryDelimited.serialize(message: proto, to: outputStream)
并初始化输入和输出并将其连接到您的服务器使用
var inputStream : InputStream!
var outPutStream : OutputStream!
func setupNetworkCommunication() {
var readStream: Unmanaged<CFReadStream>?
var writeStream: Unmanaged<CFWriteStream>?
CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault,
"localhost" as CFString,
port,
&readStream,
&writeStream)
inputStream = readStream!.takeRetainedValue()
outputStream = writeStream!.takeRetainedValue()
inputStream.delegate = self
outputStream.delegate = self
inputStream.schedule(in: .main, forMode: .common)
outputStream.schedule(in: .main, forMode: .common)
inputStream.open()
outputStream.open()
}