GET 照会のみを処理できる命令に従って、最も単純な Java Web サーバー プログラムを作成しようとしています。主なアイデアは、ソケットから ObjectOutputStream を取得し、ObjectInputStream を使用してローカル ファイルを開き、バイト単位で ObjectOutputStream に書き込むことです。
以下serve()
に添付します。書き込み先の ObjectOutputStream とファイルへのパスをパラメーターとして取ります。
public void serve(ObjectOutputStream out, String path) throws IOException {
System.out.println("Trying to serve: " + path);
File file = new File(path);
if (!file.exists()) {
//return an HTTP 404
} else {
out.writeBytes("HTTP/1.1 200 OK\n\n");
ObjectInputStream in = null;
try {
in = new ObjectInputStream(new FileInputStream(file));
int data;
while ((data = in.readByte()) != -1) {
out.writeByte((byte) data);
}
System.out.println("Request valid.");
} catch (IOException e) {
System.out.println("Error in serve(): sending file: " + e.getMessage());
} finally {
if (null != in)
in.close();
}
}
}
ただし、ブラウザーを使用して localhost:8080 (ポートは 8080) にアクセスすると、IOException がスローされます。
invalid stream header: 3C68746D
私はそれがout.writeByte((byte) data);
歩調を合わせていると信じています。原因と修正方法を教えてください。ありがとうございます。