我需要从家庭自动化服务器获取设备列表的状态。我要查询的设备在一个数组中。
我正在尝试循环遍历该数组,对于每个设备,我正在向服务器发送数据。我遇到的问题是服务器只收到一个包含我的 3 个命令的字符串。
循环发送这3条命令:
gs,6297\r\n
gs,5867\r\n
gs,9737\r\n
我在很多地方读到,我只需要附加一个回车换行符即可解决我的问题,但它不起作用。
我使用 Wireshark 来分析发生的情况。这 3 个命令作为一个大字符串发送:
gs,6297..gs,5867..gs,9737..
其中 .. 是 0d 0a。
我已经使用运行循环方式实现了我的 NSStream,就像在许多地方看到的那样:
outputStream!.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
这是我的发送功能:
func send(message:String){
if (self.outputStream!.hasSpaceAvailable){
let data:NSData = message.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!
let bytesWritten = self.outputStream!.write(UnsafePointer(data.bytes), maxLength: data.length)
println("> \(message) | Length: \(data.length)")
} else {
println("# stream busy")
}
}
以及我的查询循环:
func GetDeviceStatus(array: [sDevice]){
for (index, value) in enumerate(array) {
while (true) {
if (self.outputStream!.hasSpaceAvailable){
self.send("gs,\(value.DevRef)\r\n")
sleep(1)
break
}
}
}
}
也许,循环太快了。如果我取消注释 sleep(1),服务器会收到 3 个命令,并且 Read() 函数会收到 3 个不同的响应。一切正常。但添加 sleep 功能会阻塞且缓慢......
有人可以帮忙吗?我在这个问题上花了很多时间。
最佳答案
您的问题是您认为 TCP 保留消息边界,但事实并非如此。 TCP 连接是字节流,而不是消息流。您的服务器不能假设它将每个命令作为单独的“消息”读取。相反,它需要查看它读取的字节并在 \r\n
边界上分解字节。
关于ios - Swift NSStream 发送多个不同的命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30794429/