0

Javaを使用して単純なHTTPサーバーを構築しようとしています。

java.net.ServerSocket = new ServerSocket(this.port, 0, this.ip);
java.net.Socket connection = null;
connection = server.accept();
java.io.OutputStream out = new BufferedOutputStream(connection.getOutputStream());

Webブラウザーを使用して接続する場合、文字列から出力(HTTPヘッダー+ htmlコード)を書き込むだけです。

String headers = "http headers";
String response = "this is the response";
out.write(headers.getBytes());
out.write(response.getBytes());
out.flush();
connection.close();

そしてブラウザはそれを正しく表示します。

そして今、私の問題は、完全なWebページ(html、javascript、css、images)を作成し、それらのファイルをJavaパッケージ(JAR)ファイルに入れたいということです。もちろん、これらのファイルは、後で変更されないように設計されています。 JARを使用する準備が整いました。そして、ここに質問があります:

  1. これを達成する方法は?ファイルをJAR内に保存し、接続が確立されたときにそれらを出力します。

  2. どのように画像ファイル(非テキスト)を出力するのと同じように出力Stringout.write()ますか?

おかげで、どんなサンプルやコードでも大歓迎です。

4

3 に答える 3

0

それが家事でない限り、私は車輪の再発明をして別のWebサーバーを開発しようとはしません。その目的に使用できる小さな組み込みJavaWebサーバーが利用可能です。

たとえば、TinyJavaWebサーバーとサーブレットコンテナを数回使用しています。

これをアプリケーションに統合している場合は、JARファイルのリソースからファイルを読み取る新しいjavax.servlet.http.HttpServletを実装できます。Tomasz Nurkiewiczがすでに指摘したように、コンテンツをロードできますgetClass().getRourceAsStream(...)

于 2011-11-20T15:19:57.803 に答える
0

JARファイルを操作するには、JarOutputStreamまたはZipOutputStreamを使用します。バイナリデータを出力するには、出力ストリームをWriterでラップしないでください。OuputStreamは、メソッドwrite(byte)とを使用してバイトを書き込むことを認識していますwrite(byte[])

ここでの唯一の質問は、「なぜ自分でHTTPサーバーを開発しているのですか?」です。

于 2011-11-20T15:16:36.907 に答える
0

HTTPサーバーの実装が主な問題ですか、それとも他の目標を達成するための方法ですか?後者の場合は、TomcatまたはJettyを組み込むことを検討してください。これは、はるかに単純で、標準のサーブレットAPIを使用します。

質問に戻る:JARは単なるZIPファイルであり、ファイル、画像、映画など、何でもそこに置くことができます。JARファイル内にファイルを配置すると、次の方法で簡単にロードできます。

InputStream is = getClass().getResourceAsStream("/dir/file.png");

getResourceAsStream()仕組みの詳細については、次の質問を参照してください。

2番目の質問について:InputStreamインスタンスがある場合は、バイトごとに読み取り、ターゲットにコピーできますout OutputStream。もちろん、より良い、より安全でより速い方法がありますが、それはこの質問の範囲を超えています。IOUtils.copy()を見てください:

IOUtils.copy(is, out);

そして、コードに関する最後のヒント:sを送信する場合は、より簡単なAPIをString検討OutputStreamWriterしてください。PrintWriter

于 2011-11-20T15:18:31.197 に答える