2016-05-14 10 views
0
func onSocket(sock: AsyncSocket!, didConnectToHost host: String!, port: UInt16) { 
    print("+++++++++++++ onSocket +++++++++++++") 

    var data:NSData = NSData() ///Users/gameover/Works/Apple/SocketLab/SocketLab/SocketUtil.swift:33:13: Variable 'data' was never mutated; consider changing to 'let' constant 
    let loginIn = UserLoginIn.Builder() 
    loginIn.setId(Int32(3)) 
     .setUsername("nothing") 
     .setPassword("123456") 

    do { 
     let loginInBuild = try loginIn.build() 
     print(try loginInBuild.encode()) 
     let length = loginInBuild.serializedSize() 
     let msg:NSMutableData = NSMutableData(length: Int(length + length.computeInt32SizeNoTag()))! 

     let stream = CodedOutputStream(data: msg) 
     try loginInBuild.writeToCodedOutputStream(stream) 

     try stream.writeRawData(data) 
     print(NSString(data: data, encoding: NSUTF8StringEncoding)) 
     print("\(data.length) \(loginInBuild.serializedSize())") // this output: 0 19 why? 
    } catch { 
     print(error) 
    } 

    client.writeData(data, withTimeout: 0, tag: 0) 
    client.readDataWithTimeout(10, tag: 0) 
} 

これ以降の場合は、try stream.writeRawData(data); data.lengthはまだ0です。どのようにそれをNSDataに記述し、パッケージヘッダにパッケージ長を追加するか。私はそれが正しいならば、私は知らないprotobuf-swift CodeOutputStreamでNSDataにストリームを書き込めませんか?

try loginInBuild.writeToCodedOutputStream(stream) 

の前で

try stream.writeInt32NoTag(loginInBuild.serializedSize()) 

が追加されますか?
いずれかが役に立ちますか?ありがとう!

答えて

0

あなたは、次の区切り文字でNSMutableDataを作成し、プロトコルバッファを追加し、適切なサイズで

let array = [length] 
let delimiter = NSData(bytes: arr, length: arr.count * sizeof(Int32)) 

を区切り文字を作成し、あなたのプロトを作成し、そのサイズ

guard let loginInBuild = try? UserLoginIn.Builder().setId(Int32(3)).setUsername("nothing").setPassword("123456").build() else { return } 
let length = loginInBuild.serializedSize() 

を取得する必要があります。

let pData = NSMutableData(data: delimiter) 
pData.appendData(loginInBuild) 

最初にデリミタを入れてからprotoを入力します。今すぐpDataをストリーミングすることができます

サーババックエンドはストリームを読み取り、デリミタデータを最初に取得します。これから、プロトコルバッファのサイズが決定されるので、適切なサイズとデータでプロトオブジェクトを初期化することができます。複数の連続したプロトを送信し続けると、常にデリミタとプロトを得ることになります。

関連する問題