3

バイト配列を取得する単純な TCP サーバーソケットがあります。この GET は、gif 画像への img src リンクを含むこのサーバー上の Web サイトに入ったときに発生します。要求は次のようになります。

GET /myHome.htm HTTP/1.1
GET /house.gif HTTP/1.1

これで、バイト配列は次のようになります。

byte[] fileByte = Files.readAllBytes(filePath);

この画像を含む Web サイトを印刷するには、次のようにします。

out.writeBytes(new String(fileByte));

アウト:

DataOutputStream out= new DataOutputStream(socketClient.getOutputStream());

画像を表示するには、別のものを使用する必要があると思います

out.writeBytes()

しかし、私は確かに知りません。画像を表示する方法を知っている人はいますか?現在、画像はまったく表示されていません。

4

1 に答える 1

3

まず、GIF ファイルが破損していないことを確認します。(私も以前はそうでした)。

その場合は、GIF ファイルを送信するために次のコードを試してください。

byte[] fileByte = Files.readAllBytes(filePath);
writer.writeBytes("HTTP/1.1 200 OK\r\n");
writer.writeBytes("Content-Type: image/gif\r\n");
writer.writeBytes("Content-Length: "+fileByte.length+"\r\n");
writer.writeBytes("\r\n");
writer.write(fileByte, 0, fileByte.length);

そして、「myHome.htm」ではなく「house.gif」に直接移動してみてください。これが何をするのかコメントで教えてください。

以前の回答試行:

私はあなたの質問を誤解したかもしれないと思います。別の答えを試してみましょう:

HTML ファイル myHome.htm を返すタイミングと house.gif を返すタイミングをサーバーで判断する方法がわかりませんか?

このためには、要求された URL を単純に解析する必要があると思います。「house.gif」が含まれているかどうかを確認してください。次に、これに応じて、上記のように HTML ファイルを返すか、.gif ファイルを送信します。

writer.write(fileByte, 0, fileByte.length);

バイナリデータを送信し、返信ヘッダーを設定する

Content-Type: image/gif

ただし、どちらの場合も (HTML ファイルと GIF ファイルの場合)、送信するデータの先頭に正しい HTTP 応答ヘッダーを追加する必要があります。ページタイトルを間違った方法で解釈しないでください。ただし、次のサイトが役立つ場合があります: http://net.tutsplus.com/tutorials/other/http-headers-for-dummies/

念のため: サーバーは 2 つの独立したリクエストを受信します。1 つ目は HTML ファイルを要求し、2 つ目は GIF ファイルを要求します。したがって、どちらか一方を送信します。したがって、HTML ファイルの代わりに GIF を送信する「特別な方法」はありません。同じ clientSocket を使用します。しかし、それは別の接続です。

以前の回答:

返されたデータの MIME タイプが欠落している可能性があると思います。次の HTTP ヘッダーを返信に追加してみてください。

Content-Type: image/gif

実際には...正しいHTTP応答を送信していますか(ヘッダー、特にContent-Lengthを含む)? そうでない場合は、コメントを送信してください。これに必要なコードを投稿します。

何らかの理由でコンテンツ タイプ ヘッダーを設定して、画像を送信していることをブラウザに知らせることができない場合は、指定するのではなく XMLHttpRequest を使用して JavaScript 関数にバイナリ データをクライアントにロードできる場合があります。 img タグのソース URL として。次に、JavaScript を使用して、正しい MIME タイプでバイナリ データを dataURI ( http://en.wikipedia.org/wiki/Data_URI_scheme ) にエンコードし、それを画像のソースとして設定します。

実際、私はあなたのコードで何かに気づきました:

new String(fileByte)

fileBytes をバイナリではなくユニコード文字として解釈する可能性があります。次に、これをライターに書き込むと、イメージ内のすべてのデータが有効な Unicode であるとは限らないため、失敗する可能性があります。行を次のように置き換えてみてください。

writer.write(fileByte, 0, fileByte.length);

多分これはあなたがそれを修正するためにあなたがする必要があるすべてです???

于 2013-02-10T22:30:40.733 に答える