我正在使用Swift网络框架制作一个简单的测试应用程序。一个服务器,一个客户机(两个iOS模拟器),并成功地在它们之间建立了tcp连接。我正试着发送一系列短消息。
服务器正在发送由自然数组成的字符串,从1到999。每个数字作为单独的数据发送,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在发送消息时是否在进行可怕的更改?
如何才能发送一系列单独的信息?
发布于 2020-12-09 05:25:13
我不熟悉这个Network框架。但是从阅读文档来看,您似乎直接使用传输层来传输消息。
如果没有应用层协议,客户端可能无法区分不同的消息。例如,使用http作为您的应用程序协议在请求中有不同的参数来确定它是否是完整的消息(内容长度、内容编码、传输编码等)(希望专家能够对此进行确认)
您可以定义自己的简单协议,以便能够在客户端进行解码。例如,您可以用<Message>your-message</Message>包装每条消息,并使用它在客户端识别不同的消息(在此过程中,您将面临一些简单的缺点)。
在开发自定义协议时,需要考虑许多问题。如果你认真的话,最好阅读一下这个问题。
经进一步阅读,似乎提供了以下收到的资料:
final func receiveMessage(completion: @escaping (Data?, NWConnection.ContentContext?, Bool, NWError?) -> Void)..。能够读取完整的数据。讨论部分将提供一些关于所需的传输类型、含义和框架逻辑的有价值的见解。
https://stackoverflow.com/questions/65098702
复制相似问题