簡體   English   中英

Swift 網絡框架與 TCP

[英]Swift Network framework with TCP

我正在使用 Swift 網絡框架制作一個簡單的測試應用程序。 一台服務器,一台客戶端(都是iOS模擬器),成功建立了tcp連接。 我正在嘗試發送一系列短消息。

服務器正在發送由 1 到 999 的自然數組成的字符串。每個數字都作為單獨的 Data、 isCompletecontentContext默認值分別為true.defaultMessage發送。

var count = 0

func send(data: Data) {
    self.connection.send(content: data, completion: .contentProcessed( { error in
        if let error = error {
            self.connectionDidFail(error: error)
            return
        }
        self.count += 1
        let newData = "\(self.count)".data(using: .utf8)!
        if self.count < 1000 {
            self.send(data: newData)
        }
        print("connection \(self.id) did send, data: \(newData as NSData)")
    }))
}

客戶正在接收它們...

private func setupReceive() {
    nwConnection.receive(minimumIncompleteLength: 1, maximumLength: 65536) { (data, contentContext, isComplete, error) in
        if let data = data, !data.isEmpty {
            print("isComplete: \(isComplete)")
            print("isFinal: \(contentContext.isFinal)")
            let message = String(data: data, encoding: .utf8)
            print("connection did receive, data: \(data as NSData) string: \(message ?? "-" )")
        }
        if let error = error {
            self.connectionDidFail(error: error)
        } else {
            self.setupReceive()
        }
    }
}

……但是有什么不對。 有些消息看起來像是它們的字節粘在一起(例如,連續消息“2”、“3”、“4”、“5”可能像單個消息“2345”一樣被接收)

對於所有收到的消息, isComplete等於false並且contentContext屬性isFinal等於true ,而.defaultMessage.isFinal應該等於false

現在,我被困住了。 我只是使用了錯誤的參數(我嘗試了各種組合,但似乎沒有一個對我有用)? NWConnection 在發送消息時是否會發生可怕的變化?

一個人如何發送一系列單獨的消息?

我不熟悉這個Network框架。 但是從閱讀文檔來看,您似乎是直接使用傳輸層來傳輸消息。

如果沒有應用層協議,客戶端可能無法區分不同的消息。 例如,使用 http 作為您的應用協議,請求中有不同的參數來識別它是否是完整的消息(Content-Length,Content-Encoding,Transfer-Encoding 等...)(希望專家可以確認)

您可以定義自己的簡單協議,以便在客戶端進行解碼。 例如,您可以用<Message>your-message</Message>包裝每條消息,並使用它在客戶端識別不同的消息(在此過程中,您將面臨一些如此簡單的缺點)

開發自定義協議時需要考慮很多事情。 如果您是認真的,最好閱讀有關此主題的內容。

進一步閱讀后,似乎提供了以下接收:

final func receiveMessage(completion: @escaping (Data?, NWConnection.ContentContext?, Bool, NWError?) -> Void)

...能夠讀取完整數據。 討論部分將就傳輸類型的含義和所需的框架邏輯提供一些有價值的見解。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM