Swift NSStream发送多个区别命令

时间:2015-06-12 02:24:05

标签: 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,就像在许多地方使用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个区分响应。一切正常。但是补充一点,睡眠功能阻塞并缓慢......

有人可以帮忙吗?我花了很多时间来处理这个问题。

1 个答案:

答案 0 :(得分:0)

您的问题是您认为TCP保留了邮件边界,但它并没有。 TCP连接是字节流,而不是消息流。您的服务器不能假定它会将每个命令作为单独的消息"进行读取。相反,它需要查看它读取的字节并在\r\n边界上打破字节。