2

HTTP Web サーバー内に画像を表示しようとしていますが、できません。HTMLを表示できました。IO(入力および出力ストリーム)の処理方法に関係があると思います。気付いていない間違いもたくさんあると思います。

import java.io.* ;
import java.net.* ;
import java.util.Properties;


public class HTTPThread extends Thread
{
    private Socket socket = null;
    private Properties config = null;
    private String root = "";

    public HTTPThread(Socket s, Properties config)
    {
        this.socket = s;
        this.config = config;
        this.root = this.config.getProperty("root");        
    }

    public void run()
    {   

//      InputStream in = null;
        OutputStream out = null;

        try
        {
            out = socket.getOutputStream();
            PrintWriter writer = new PrintWriter(out, true);

            BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String request = reader.readLine();
            writer.println("HTTP/1.1 200 OK");
            writer.println("Content-Type: text/html");          
            writer.println();

            // Search for filename 
            int slash = request.indexOf("/"); //find first occurrence of slash
            int emptySpace = request.indexOf(" ", slash); //find first space after slash
            String filename = request.substring(slash, emptySpace); //return filename 
//          writer.println("<b>" + filename + "</b>");

            String pathname = "";
            try
            {
                pathname = (filename == "/") ? root + filename : root;
//              System.out.println(filename);           
                URL url = new URL(pathname);
                URLConnection urlc = url.openConnection();
                BufferedReader in = new BufferedReader(
                        new InputStreamReader(
                        urlc.getInputStream()));

                String line;                
                while ((line = in.readLine()) != null)
                {
                    writer.println(line);
                }
                in.close();
            }
            catch (MalformedURLException e)
            {
                System.err.println("Don't know about host: " + pathname);
                System.exit(1);
            }
            catch (IOException e)
            {
                  System.err.println("Couldn't get I/O for "
                                     + "the connection to: " + pathname);
                  System.exit(1);
            }



//          reader.close();
            writer.close();
            socket.close();
        }
        catch(IOException e)
        {
            System.out.println("Error: " + e);          
        }

        finally
        {
            try
            {
//              in.close() ;
                out.close() ;
                socket.close();
            }
            catch(IOException e)
            {
                System.out.println("Error: " + e);          
            }
        }
    }
}
4

1 に答える 1

3

リクエストから外部 URL を取得してコンテンツを返す、ある種のプロキシ サーバーを作成しようとしていますか? コードにはいくつかの問題があります。

writer.println("HTTP/1.1 200 OK");
writer.println("Content-Type: text/html");          

ブラウザが上記を確認すると、返されたものはすべて HTML であると見なされます。バイナリイメージを HTML としてレンダリングすると、明らかに失敗します。これにより、次のことがわかります。

String line;                
while ((line = in.readLine()) != null)
{
    writer.println(line);
}
in.close();

上記のループでは、外部 URL を 1 行ずつ (テキスト モードで) 読み取り、それを元のクライアントに転送しています。これは HTML (テキストベース) では機能しますが、画像 (バイナリ) では失敗します。代わりにInputStream/を使用する必要があります。OutputStream

最後に小さなこと:

pathname = (filename == "/") ? root + filename : root;

演算子を使用して文字列を比較しないでください==。次のように置き換えます。

pathname = (filename.equals("/")) ? root + filename : root;

最後に、Tomcat や Jetty などのサーブレット コンテナーを使用することを検討してください。これにより、HTTP 処理コードから解放され、より高レベルの構造が提供されます。

于 2012-10-16T19:48:05.117 に答える