我需要从家庭自动化服务器获取设备列表的状态。我想要查询的设备是一个数组。
我正在通过该阵列进行循环,对于每个设备,我都在向服务器发送信号。我遇到的问题是服务器只收到一个包含我的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,就像在许多地方使用run-loop方式看到的那样:
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
}
}
}
}
也许,循环要快。如果我取消注释睡眠(1),则服务器接收3个命令,而Read()函数接收3个区分响应。一切正常。但是补充一点,睡眠功能阻塞并缓慢......
有人可以帮忙吗?我花了很多时间来处理这个问题。
答案 0 :(得分:0)
您的问题是您认为TCP保留了邮件边界,但它并没有。 TCP连接是字节流,而不是消息流。您的服务器不能假定它会将每个命令作为单独的消息"进行读取。相反,它需要查看它读取的字节并在\r\n
边界上打破字节。