【问题标题】: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()
        }
    

    【讨论】:

      猜你喜欢
      • 2011-11-06
      • 1970-01-01
      • 2019-07-30
      • 2012-09-10
      • 2015-10-27
      • 1970-01-01
      • 1970-01-01
      • 2011-05-20
      • 1970-01-01
      相关资源
      最近更新 更多