Хорошо, после месяцев и дней работы над этим, я нашел правильный способ сделать это, и это не с сокетом.
Для отправки и получения 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()
}