3

我在 qt 中为非常特定的需求创建了一个非常简单的网络服务器。就这么简单,让我们有一个 http 请求: GET /cover.png HTTP 1.1

响应完美地到达台式计算机。当我尝试从移动设备获取图像时(我尝试了更多,但可以说是 android+opera),图像不会加载。在 Opera 中,它只加载大约 1/3 的图片,而在服务器端 qt 声称所有字节都发送正常。

我注意到这取决于图像的大小:~4k 是可以的,但 12k 是“太多”

我知道 android 上的歌剧可以加载更大的图像,所以我必须在响应中搞砸一些东西。但同时,在我的桌面上,所有主流浏览器都很好。

我注意到在显示部分加载的图像后,opera 会打开一个新的 tcp 连接到我的服务器,但什么也没发送!它是否试图分块加载图像?http中有这样的东西吗?

我真的迷失了这里的东西......

更新:如果文件足够大,它将无法在桌面环境中运行!经验限制:桌面:最大。65339 字节移动:最大。12834 字节

由于限制根本不一样,我认为它与 Qt 无关。

4

2 回答 2

0

第 241 行有一个错字:

int len = 4096;

应该:

int len = 32768;
于 2013-02-14T04:03:42.447 回答
0

我设法弄清楚:图像的下载停止,因为我的服务器过早地关闭了 tcp 连接。这很奇怪,因为我发送这样的回复:

socket->write( message );
if( !socket->waitForBytesWritten( 5000 ) )
{ puts( "Timed out!" ); }
emit sent();

这种方式行不通。QTcpSocket 是一个缓冲的 IODevice,所以如果发送超时它应该打印。也许我对 waitForBytesWritten() 有误解。所以事实证明这毕竟是一个 Qt 问题。如果我在发送后不删除套接字,它就可以了。桌面和移动浏览器的大小限制差异在于它们可以达到的速度(在我删除套接字之前它可以接收多少字节)。

那么如何确定所有字节何时真正发送到客户端呢?

于 2013-02-14T17:39:11.003 回答