gpt4 book ai didi

ios - InputStream.read 有时会停止读取

转载 作者:行者123 更新时间:2023-12-05 07:42:44 28 4
gpt4 key购买 nike

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

我的代码是:

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 字节,我遇到过这样的情况,即流在第一次运行时只读取了几百个字节,然后说:伙计,一切都完成了!没什么可读的了……

行为不可预测。用相同的消息对其进行了多次测试,它有效,有效,有效,无效,......

有什么建议吗?

最佳答案

为避免 Inputstream 读取器挂起或崩溃,您可以先将 InputStream 读取为字符串...

String myString = "Hello there how are you";
InputStream inputStream = new ByteArrayInputStream(myString .getBytes(StandardCharsets.UTF_8));

如果从套接字读取...

String myString = socket.getInputStream().toString();  //if reading socket

然后您可以分配 Inputstream 变量...

InputStream inputStream = new ByteArrayInputStream(myString .getBytes(StandardCharsets.UTF_8));

关于ios - InputStream.read 有时会停止读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44261683/

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