68710


サーバとクライアントの学習をしています。  
apacheを入れ、ローカルで通信?やってみよー！、というタイミングで408エラーが出て対処に困っている状態です。

**行ったこと**

  1. Client_Send.txtに以下<1>を記述
  2. Apacheを立ち上げる。  
ブラウザで `http://localhost/index.html` をした際、「It works!」は表示される。

  3. 以下<2>のクライアントプログラムを実施する。  
→ 時間がかかったのち、408エラーが表示される。<3>

ブラウザでのアクセスができるので、ファイルが見つからないわけではないと思うのですが、なぜクライアントプログラム実施時にエラーがでるのかがわかりません。

**< 1>**

[code]

    GET /index.html HTTP/1.1
    Host: localhost:8001
    Connection: keep-alive
    Upgrade-Insecure-Requests: 1
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
    Sec-Fetch-Site: none
    Sec-Fetch-Mode: navigate
    Sec-Fetch-User: ?1
    Sec-Fetch-Dest: document
    Accept-Encoding: gzip, deflate, br
    Accept-Language: ja-JP,ja;q=0.9,en-US;q=0.8,en;q=0.7
    
[/code]

**< 2>**

[code]

    package sarver1;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.Socket;
    
    public class TCPClient1 {
        public static void main(String[] args)throws Exception{
            try(Socket socket=new Socket("localhost",80);
                    FileInputStream fis=new FileInputStream("Client_Send.txt");
                    FileOutputStream fos=new FileOutputStream("Client_Recv.txt")){
    
                int ch;
                //Client_Send.txtの内容をサーバに送信
                OutputStream output=socket.getOutputStream();//ストリームを取得し、ここから読み書きする。
                while((ch=fis.read())!=-1) {
                    //ストリームを通して出力していく
                    output.write(ch);
                }
                System.out.println("送信しました");
                //終了するため0を送信
                //output.write(0);
    
                //サーバーからの返信をClient_Recv.txtに出力
                InputStream input=socket.getInputStream();//ストリームを取得し、ここから読み書きする。
                while((ch=input.read())!=-1) {
                    fos.write(ch);
                }
                System.out.println("受けとりました");
            }catch(Exception ex) {
                    ex.printStackTrace();
            }
        }
    }
    
[/code]

**< 3>**

[code]

    HTTP/1.1 408 Request Timeout
    Date: Sat, 18 Jul 2020 11:48:38 GMT
    Server: Apache/2.4.43 (Win64)
    Content-Length: 221
    Connection: close
    Content-Type: text/html; charset=iso-8859-1
    
    <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
    <html><head>
    <title>408 Request Timeout</title>
    </head><body>
    <h1>Request Timeout</h1>
    <p>Server timeout waiting for the HTTP request from the client.</p>
    </body></html>
    
[/code]


CC BY-SA 4.0
2020-07-18T12:23:36.513
68706
2020-07-18T13:57:28.607
2020-07-18T12:46:59.563
3060
41141
question
java apache
クライアントプログラムの408エラー


`<1>`(`Client_Send.txt`)の最終行に「空行」がないため、ApacheでHTTPリクエストの送信が完了していないと見なされ、Apacheが一定時間後にタイムアウト判定しているのではないでしょうか?

＃HTTPでは、空行を以ってHTTPヘッダとリクエストボディを分割する仕様です。

なお、空行を含めて、改行は「CR+LF」(`\r\n`)である必要があります。合わせて注意してください。


CC BY-SA 4.0
2020-07-18T13:57:28.607
68710
2020-07-18T13:57:28.607
20098
68706
answer