TransWikia.com

クライアントプログラムの408エラー

スタック・オーバーフロー Asked by user41141 on September 1, 2021

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

行ったこと

  1. Client_Send.txtに以下<1>を記述
  2. Apacheを立ち上げる。
    ブラウザで http://localhost/index.html をした際、「It works!」は表示される。
  3. 以下<2>のクライアントプログラムを実施する。
    → 時間がかかったのち、408エラーが表示される。<3>

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

<1>

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

<2>

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();
        }
    }
}

<3>

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>

One Answer

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

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

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

Correct answer by user20098 on September 1, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP