質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

Q&A

解決済

1回答

2124閲覧

ApacheにRequstを投げてもStatus Code 400番が返るが理由がわからない

ikemonnn

総合スコア5

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

0グッド

0クリップ

投稿2021/05/01 06:53

編集2021/05/01 07:34

###apacheからレスポンスをうまく取得できない

初学者です。クラサバの挙動を勉強しています。

Apacheにclent_send.txtリクエストを投げたらclent_recv.txtにレスポンスが返ってくるようにしたいです。

環境:Apache httpd(Macの標準搭載)
行ったコマンド:java Tcp Client.java

clent_send.txt

GET / HTTP/1.1 Host: localhost:8001 Connection: keep-alive Cache-Control: max-age=0 sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="90", "Google Chrome";v="90" sec-ch-ua-mobile: ?0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,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: en-US,en;q=0.9,ja;q=0.8,zh-TW;q=0.7,zh;q=0.6

clent_recv.txt

HTTP/1.1 400 Bad Request Date: Sat, 01 May 2021 06:40:16 GMT Server: Apache/2.4.46 (Unix) Content-Length: 226 Connection: close Content-Type: text/html; charset=iso-8859-1 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>400 Bad Request</title> </head><body> <h1>Bad Request</h1> <p>Your browser sent a request that this server could not understand.<br /> </p> </body></html>

TcpClient.java

Java

1 2import java.io.*; 3import java.net.*; 4 5public class TcpClient { 6 public static void main(String[] args) throws Exception { 7 //ソケットを作成してサーバーと繋がった 8 try(Socket socket = new Socket("localhost", 80); 9 FileInputStream fis = new FileInputStream("client_send.txt"); 10 FileOutputStream fos = new FileOutputStream("client_recv.txt")){ 11 12 int ch; 13 OutputStream output = socket.getOutputStream(); 14 while((ch = fis.read()) != -1) { 15 output.write(ch); 16 } 17 18 //終了を示すため0を送信 19 // output.write(0); 20 //サーバーからの返信を出力する 21 InputStream input = socket.getInputStream(); 22 while((ch = input.read()) != -1) { 23 fos.write(ch); 24 } 25 } catch(Exception ex) { 26 ex.printStackTrace(); 27 28 } 29 } 30}

TcpServer.java

Java

1 2import java.io.*; 3import java.net.*; 4 5public class TcpServer { 6 public static void main(String[] args) throws Exception { 7 try(ServerSocket server = new ServerSocket(8001); 8 FileOutputStream fos = new FileOutputStream("server_recv.txt"); 9 FileInputStream fis = new FileInputStream("server_send.txt")) { 10 11 System.out.println("クライアントからの接続を待ちます"); 12 //acceptメソッドは接続待ち。。。 13 Socket socket = server.accept(); 14 System.out.println("クライアント接続。"); 15 16 int ch; 17 InputStream input = socket.getInputStream(); 18 while((ch = input.read()) != 0) { 19 fos.write(ch); 20 //出力ストリームに書き込む 21 } 22 OutputStream output = socket.getOutputStream(); 23 while((ch = fis.read()) != -1) { 24 output.write(ch); 25 } 26 socket.close(); 27 System.out.println("通信を終了しました"); 28 } catch(Exception ex) { 29 ex.printStackTrace(); 30 } 31 } 32}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2021/05/01 06:59

>Apatch リクエスト結果にあるように「Apache」です。 起きてる問題とは関係ないかもしれませんが、固有名詞の間違いはそのまま致命的になるのがプログラムです。
m.ts10806

2021/05/01 07:00

あとWebサーバーはTomcatではなくApacheなんですね? どのように環境構築をし、どのように実行しているのが具体的に記載してください。
ikemonnn

2021/05/01 07:34

不慣れで申し訳ありませんでした。追記いたしました。
guest

回答1

0

ベストアンサー

HTTPリクエスト送信時に使っている「clent_send.txt」ファイル中のテキストデータですが、改行コードがLF(0x0a)のみになっていませんか?どうも、apache2はリクエスト中の改行コードがCRLF(0x0d,0x0a)でないと受け付けないようです。これは、HTTPを規定したRFC2616でもそのように記載されていますね。apacheはこれに正しく準拠しているようです。

RFC2616#section-5 Request - RFC 2616 - Hypertext Transfer Protocol

対応として、GET / HTTP/1.1等の各行の改行コードをCR LFにすればHTTPステータス200で返ってきました。ちなみにCRのみでもいけました。(Apache 2.2.22 Debianでの例)

尚、ヘッダーフィールドに指定しているHost: localhost:8001はちょっと間違いなのでは? 適切にセットしておきましょう。

投稿2021/05/01 08:04

dodox86

総合スコア9183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikemonnn

2021/05/01 08:37

ありがとうございます。 改行コードを直したら200番が返ってきました。 助かりました!!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問