Как я могу получить данные из сокета и создать файл protobuf? - PullRequest
0 голосов
/ 15 мая 2019

Как получить файл из сокета в swift и преобразовать его в swift protobuf?

Прежде всего я использую синий сокет от IBM.

Я пытаюсь получить размерprotobuf в формате String, затем преобразуйте его в int, а затем я открываю буфер размера, полученного с сервера.

Проблема в том, что сокет не заполняет данные того размера, который должен быть.

Как я могу сделать данные с фиксированным размером (размер, который я получаю в строковом формате) и ждать, пока они заполнятся данными, а затем преобразовать в protobuf?

И есть ли другие способы?

1 Ответ

1 голос
/ 26 мая 2019

Хорошо, после месяцев и дней работы над этим, я нашел правильный способ сделать это, и это не с сокетом.

Для отправки и получения protobuf на сервер у них есть нечто, называемое BinaryDelimited.

Для получения протобуфа с сервера вы будете использовать:

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()
    }
...