ios - 带有 TCP 的 Swift 网络框架

标签 ios swift tcp network-programming

我正在使用 Swift Network 框架制作一个简单的测试应用程序。一台服务器,一台客户端(都是iOS模拟器),并成功建立了它们之间的tcp连接。我正在尝试发送一系列短消息。
服务器正在发送由 1 到 999 的自然数组成的字符串。每个数字都作为单独的 Data、isComplete 和 contentContext 默认值分别为 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框架。但是从阅读文档来看,您似乎是直接使用传输层来传输消息。
如果没有应用层协议(protocol),客户端可能无法区分不同的消息。例如,使用http作为你的应用协议(protocol)在请求中有不同的参数来识别它是否是一个完整的消息(Content-Length,Content-Encoding,Transfer-Encoding等......)(希望专家可以确认)
您可以定义自己的简单协议(protocol),以便在客户端进行解码。例如,您可以用 <Message>your-message</Message> 包装每条消息。并使用它来识别客户端的不同消息(在此过程中,您将面临一些如此简单的缺点)
开发自定义协议(protocol)时需要考虑很多事情。如果您是认真的,最好阅读有关此主题的内容。
进一步阅读后,似乎提供了以下接收:

final func receiveMessage(completion: @escaping (Data?, NWConnection.ContentContext?, Bool, NWError?) -> Void)
...能够读取完整数据。讨论部分将就传输类型的含义和所需的框架逻辑提供一些有值(value)的见解。

关于ios - 带有 TCP 的 Swift 网络框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65098702/

相关文章:

android - Hive 生成​​的文件错误 - "control-flow-collections"实验未启用 - Flutter/Dart

ios - 旋转问题后翻转图像(需要同时执行两项操作,只执行一项)

swift - 如何获取具有键盘/鼠标焦点的 Mac OS X 应用程序的显示范围?

ios - swift IOS : Call Specific function of UIviewController when open app from notification

tcp - 如何检查非阻塞 luasocket 客户端是否丢失了连接?

tcp - MQTT QoS 的用途/目的是什么?

node.js - 如何将服务器上的传入消息路由到 Socket.io 中的 html 页面

ios - 在一个函数中返回 self 很快就给了我 nil

android - 嵌入 YouCamMakeup 相机功能

ios - iOS 上的 Firebase 不返回新添加的条目