使用BlueSocket框架通过TCP发送的不完整图像



我一直在尝试使用Kitura BlueSocket通过TCP发送图像。

每次我尝试解码图像从数据对象我得到

警告![0x7fb6f205e400]解码不完整,错误码-1

如果图像还没有完全下载,这是预期的。

事实上,图像通常是半加载的。这是我用来下载数据对象的代码:

func readData() -> Data {
var receivedData = Data.init()
do {
try mySocket?.read(into: &receivedData)
}
catch {
print("Error receiving data")
}
return receivedData
}

,这是我如何解码图像:

func decodeImage(from: Data){
imageRead.image = UIImage(data: from)
}

这个代码在视图控制器中是这样使用的:

let imageData = networkManager.readData()
decodeImage(from: imageData)

我不知道为什么图像不能完全下载。

您正在使用低级套接字。TCP只知道数据包;它不知道什么是"图像"。或";records"或者其他任何东西。它只处理数据包。根据不同的因素,您可能会看到小到几百字节的数据包,大到几kB的数据包。

.read(into:)返回到目前为止到达的包。它不知道你图像的边界在哪里。这由你来决定。您需要循环,直到您想要处理的所有数据都到达为止(这意味着什么完全取决于您所设计的协议)。你不能在主队列上运行这个;它会阻塞你的UI。它需要在后台队列上运行。

一个非常常见的套接字级协议是先发送长度,然后发送数据。这样,读取器就知道需要传输多少数据,并知道何时完成传输。如果发送方在开始传输时不知道大小,那么您通常会使用&;end- transfer&;某种类型的令牌,或者使用将数据分成块的协议,然后有一些标记来标记"这是最后一个块"。但在任何情况下,您都需要选择或设计您想在这里使用的协议。(或者使用HTTP之类的现有系统,而不是低级套接字。)

最新更新