スタック・オーバーフロー Asked by user41141 on September 1, 2021
サーバとクライアントの学習をしています。
apacheを入れ、ローカルで通信?やってみよー!、というタイミングで408エラーが出て対処に困っている状態です。
行ったこと
http://localhost/index.html
をした際、「It works!」は表示される。ブラウザでのアクセスができるので、ファイルが見つからないわけではないと思うのですが、なぜクライアントプログラム実施時にエラーがでるのかがわかりません。
<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>
<1>
(Client_Send.txt
)の最終行に「空行」がないため、ApacheでHTTPリクエストの送信が完了していないと見なされ、Apacheが一定時間後にタイムアウト判定しているのではないでしょうか?
#HTTPでは、空行を以ってHTTPヘッダとリクエストボディを分割する仕様です。
なお、空行を含めて、改行は「CR+LF」(rn
)である必要があります。合わせて注意してください。
Correct answer by user20098 on September 1, 2021
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP