2017-02-20 4 views
0

ソケットを使用してHTTPサーバーを構築しようとしていますが、私は奇妙な問題が発生しました。すべて正常に動作するようですが、私はHTMLファイルやtxtファイルを取得するために私のブラウザを使用するとき、私は最後の文字を取得しません。HTTPサーバーが出力ストリームの最後の文字を送信しない

たとえば、かなり標準的なテスト用の.htmlファイルがあります。このファイルは、</html>の後に正確に終わるので、ブラウザはファイル全体を取得しますが、最後は</htmlで終わります。

画像は、破損しているように見えますが、これは以前の問題に関連していると思われます。

コードは以下の通りです:

printWriter.println(
     this.getStatusLineFromStatusCode(statusCode) + CRLF 
     + "Date: " + currentTime + CRLF 
     + "Server: Definitely not Apache" + CRLF 
     + ((statusCode == 200) ? 
       "Last-Modified: " + lastModified + CRLF : "") 
     + "Content-Length: " + dir.length() + CRLF 
     + "Content-Type: " + fileType + CRLF + CRLF 
    ); 

if(request.get("requestMethod").equals("GET") 
     && dir.exists() && dir.isFile()) { 
    FileInputStream in = null; 

    try { 
     System.out.println(dir.getPath()); 
     in = new FileInputStream(dir.getPath()); 
     int c; 
     while((c = in.read()) != -1) { 
      outputStream.write(c); // Here is the write operation 
     } 


    } catch(Exception e) { 
     System.out.println(e); 
    } finally { 
     if(in != null) { 
      in.close(); 
     } 
    } 
} 

printWriter.close(); 

私は、書き込みが発生した部分をコメントしました。 FileOutputStreamを使用して、ディスク内の他の場所に同時にファイルをコピーすると、ファイルが正しくコピーされるため、本当に変です。

誰もがなぜこれが起こっているのか分かりませんか?

+0

これは役立つかもしれないが? http://stackoverflow.com/a/51753/7491770 – ram

+0

@ram残念ながら私は 'IOUtils'を使用できません – Flerex

+0

出力ストリームを閉じる前にフラッシュしてください。 –

答えて

3

問題は、CRLF + CRLFを印刷していますが、printlnで印刷すると、別の改行が追加されます。この余分な改行はコンテンツの一部とみなされ、コンテンツ長ヘッダーは事前定義されているため、実際のコンテンツの最後の文字は破棄されます。まもなく

、以下の部分でprintではなくprintlnを使用します。

printWriter.println(
    this.getStatusLineFromStatusCode(statusCode) + CRLF 
    + "Date: " + currentTime + CRLF 
    + "Server: Definitely not Apache" + CRLF 
    + ((statusCode == 200) ? 
      "Last-Modified: " + lastModified + CRLF : "") 
    + "Content-Length: " + dir.length() + CRLF 
    + "Content-Type: " + fileType + CRLF + CRLF 
); 
+0

うわー。ナイスキャッチ!私は決してそれを見ません。最後の '+ CRLF'を削除しても、すべてがうまくいきますが、' println'を 'print'に変更すると、HTMLコードがテキストとして取得され、その後、テキストとしてHTTPリクエストが取得されます。 http://i.imgur.com/aKbAyLF.pngこれはなぜですか? – Flerex

+0

印刷後、ライターをフラッシュします。 autoflushを有効にして作成されていますが、新しい行、つまりprintln呼び出しの後でのみフラッシュされている可能性があります。 – ram

+0

代わりにCRLFを削除したい場合は、サーバがlinuxの場合はprintlnがCRLFではなくLFだけになるため、問題が発生する可能性があります。したがって、ダブルCRLFでプリントを使用することをお勧めします。 – ram

関連する問題