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

标签 ios swift send nsstream

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

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

相关文章:

android - Intent .ACTION_SEND Whatsapp

iphone - 我可以用 FXLabel *替换* UIButton 上的 UILabel 吗?

ios - Swift:如何在UITableViewController(包含UICollectionView)中使用 "didSelectItemAtIndexPath"?

Swift - 如何在类属性中存储结构实例

python - 输入文本以跨越 Selenium/Python

sockets - Unix套接字: how to send really big data with one “send” call?

ios - 从 Swift 中的 Objective C 项目访问 App 委托(delegate)

ios - CGBitMapContextCreate 方法导致编译器警告 Xcode 5 而不是 Xcode 4

ios - 如何更改搜索栏的范围颜色?

swift - 在类型 'failed' 中找不到枚举案例 'SKError.Code'