如何从套接字获取数据并创建protobuf文件?

时间:2019-05-15 10:15:38

标签: swift sockets protocol-buffers

如何在swift中从套接字接收文件并将其转换为swift protobuf?

首先,我正在使用IBM的蓝色插槽。

我尝试以String格式接收protobuf的大小,然后将其转换为int,然后打开一个从服务器获取的大小的缓冲区。

问题是套接字无法填充应有大小的数据。

如何制作固定大小的数据(以字符串格式获取的大小),然后等待它充满数据然后转换为protobuf?

还有其他方法吗?

1 个答案:

答案 0 :(得分:0)

好好几个月和几天的时间研究这个东西之后,我发现正确的方法了,而且不是通过套接字来实现的。

要向服务器发送和接收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()
    }