gpt4 book ai didi

ios - Swift NSStream 发送多个不同的命令

转载 作者:行者123 更新时间:2023-11-30 14:18:41 25 4
gpt4 key购买 nike

我需要从家庭自动化服务器获取设备列表的状态。我要查询的设备在一个数组中。

我正在尝试循环遍历该数组,对于每个设备,我正在向服务器发送数据。我遇到的问题是服务器只收到一个包含我的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com