2016-11-03 11 views
0

this questionからこのコードを試してみます。ちょうどstackoverflow.comを要求するとき、それは正しい返答を与えますが、私がhttps://stackoverflow.com/questions/10673684/send-http-request-manually-via-socketを試してみると、HTTP/1.1 400 Bad Requestを返します。この問題の原因は何ですか?JavaソケットがHTTP/1.1 400不正リクエストを取得する

私は上記のリンクから得た作業コードを使用して、サーバーから正しい応答を得ています。

Socket s = new Socket(InetAddress.getByName("stackoverflow.com"), 80); 
PrintWriter pw = new PrintWriter(s.getOutputStream()); 
pw.println("GET/HTTP/1.1"); 
pw.println("Host: stackoverflow.com"); 
pw.println(""); 
pw.flush(); 
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); 
String t; 
while ((t = br.readLine()) != null) { 
    System.out.println(t); 
} 
br.close(); 

Socket s = new Socket(InetAddress.getByName("stackoverflow.com"), 80); 
PrintWriter pw = new PrintWriter(s.getOutputStream()); 
pw.println("GET/HTTP/1.1"); 
pw.println("Host: https://stackoverflow.com/questions/10673684/send-http-request-manually-via-socket"); 
pw.println(""); 
pw.flush(); 
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); 
String t; 
while ((t = br.readLine()) != null) { 
    System.out.println(t); 
} 

はその後応答がHTTP/1.1 400 Bad Requestです...次のように変更しようとしました。

P.S.私は、httpライブラリを使用する予定はありません。

+2

ホストは作業コードのようにしておくべきですが、ホストの上の行を 'GET/questions/10673684/send-http-request-hand-via-socket HTTP/1.1'に変更する必要があります – Alex

+1

@Alexそのコメントを回答として入れてください。 – tddmonkey

+0

こんにちは@Alex。あなたが正しいです。どうもありがとうございます。あなたが答えを出すなら、私はそれに印をつけます。 – beginner

答えて

1

あなたの要求には問題がありますが、これは正しくありません。あなたは

pw.println ("GET /questions/10673684/send-http-request-manually-via-socket HTTP/1.1"); 
pw.println ("Host: stackoverflow.com"); 

でのPrintWriterへのお電話を交換した場合それが動作するはずです。


EDIT: EJPがこの回答にコメントで指摘したように、あなたは行末は常に\r\nであることを確認しなければなりません。あなたがのprintln関数を捨て、代わりに

pw.print ("Host: stackoverflow.com\r\n"); 

またはyou could change the default line ending to make sure println works correctlyを使用することができますいずれか、しかし、これは同様にあなたのプログラムの他の部分に影響を与える可能性があります。


さらに、あなたはあなたの質問に彼のコメントでステファンUllrichsの懸念事項の一つに対処した、読み終えた後、あなたのソケットが閉じますことを確認してみてください--リソースとを使用することができます。

しかし、最初の例ではbr.close();を呼び出します。これは基本的な入力ストリームを閉じる必要があります。これはソケットを閉じても問題ありません。しかし、私の意見では、それを明示的に行う方が良いです。

+2

"println()"を使用していない*の問題である、少なくとも行終端を修正しない限り。一連の許容HTTPサーバーで運が良ければよいかもしれませんが、HTTPサーバーであればそれだけで要求を無視/拒否することができます。 – EJP

+0

私の編集であなたの懸念に対処しようとしました。 printWriterインスタンスを作成する前にline.separatorプロパティを設定するだけで、 'println()'を使用することができます。 – Alex

関連する問題