InputStream.read有时会停止读取

时间:2017-05-30 11:59:29

标签: ios swift inputstream downloading

我的应用程序应该能够使用Stream-class从服务器接收消息。

我的代码是:

var inputStream  : InputStream? = nil
var outputStream : OutputStream? = nil

...

func establishConnection() {
    ...
    Stream.getStreamsToHost(withName: "app.mybusiness.com", port: port, inputStream: &self.inputStream, outputStream: &self.outputStream)
    ...
}

func stream(_ someStream: Stream, handle eventCode: Stream.Event) {

    switch eventCode {
        case Stream.Event.hasBytesAvailable:
        var output = ""

        var buffer = [UInt8](repeating: 0, count: 1024)

        while (self.inputStream!.hasBytesAvailable){

            let bytesRead:Int=inputStream!.read(&buffer, maxLength: buffer.count)

            if (bytesRead > 0) { // had here (bytesRead >= 0) too
                output += NSString(bytes: UnsafePointer(buffer), length: bytesRead, encoding:String.Encoding.utf8.rawValue)! as String
            } else {
                print("# error")
            }
            print("> \(output)")
        }

        // Now do something with the data we got
        HelpMethods.pushServerIncoming(inString: output)

       default:
           ...
    }

}

所以这很好用,但有时它似乎停止接收数据 它读取前1024个字节,然后是第二个1024,而不是继续(需要大约3或4次迭代才能获得整个消息)它只读取几个字节,然后inputStream.hasBytesAvailable返回false。

很容易说:啊,这就是服务器的错误,但这个问题不会发生在应用程序的android版本中。

我尝试更改缓冲区大小(从1到4096),但它没有改变任何东西。有4096个字节,我有一个案例,在第一次运行中流只读取几百个字节,然后说:所有做好友!没事了......

行为不可预测。多次使用相同的消息测试它,它工作,工作,工作,不起作用,......

有什么建议吗?

0 个答案:

没有答案