【发布时间】:2021-03-13 20:36:28
【问题描述】:
我正在使用 Swift Network 框架制作一个简单的测试应用程序。一台服务器,一台客户端(都是iOS模拟器),并成功建立了它们之间的tcp连接。我正在尝试发送一系列短消息。
服务器正在发送由 1 到 999 的自然数组成的字符串。每个数字作为单独的数据发送,isComplete 和 contentContext 默认值为 true em> 和 .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 在发送消息时是否会发生可怕的变化?
如何发送一系列单独的消息?
【问题讨论】:
-
第一段代码看起来很奇怪。您有一个名为“数据”的人作为内容。然后在几行之后创建一个名为“data”的新变量。
-
@ElTomato 只是一个局部变量。在函数范围内,它会覆盖具有相同名称的外部变量(如函数参数)。但为了清楚起见,我会重命名它。
标签: ios swift tcp network-programming