3

非常に特殊なニーズのために、qt で非常に単純な Web サーバーを作成しました。GET /cover.png HTTP 1.1 のように簡単に http リクエストを作成できます。

応答はデスクトップ コンピューターに完全に届きます。モバイル デバイスから画像を取得しようとすると (もっと試してみましたが、android+opera としましょう)、画像が読み込まれません。Opera では画像の約 1/3 しかロードされませんが、サーバー側では qt はすべてのバイトが正常に送信されたと主張します。

画像のサイズに依存していることに気付きました: ~4k は問題ありませんが、12k は「多すぎます」

私はアンドロイドのオペラがはるかに大きな画像をロードできることを知っているので、応答で何かを台無しにする必要があります。しかし同時に、やはり私のデスクトップでは、主要なブラウザはすべて問題なく動作します。

部分的にロードされた画像が表示された後、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 に答える