Java:使用TCP套接字的简单http GET请求

我在本地托管一个简单的PHP echo服务器。 我试图用Java向服务器发送消息,并使用GET请求打印响应但是收到“格式错误的HTTP请求”错误。 谁能告诉我如何正确格式化GET请求?

//客户代码:

import java.io.*; import java.net.*; public class TCPclient { public static void main(String argv[]) throws Exception { String sentence, modifiedSentence; BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); Socket clientSocket = new Socket("localhost", 8000); DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream()); BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); sentence = inFromUser.readLine(); outToServer.writeBytes(sentence + "\n"); outToServer.writeChars("GET /echo.php HTTP/1.1" +"\n"); modifiedSentence = inFromServer.readLine(); System.out.println("FROM SERVER: " + modifiedSentence); inFromServer.close(); outToServer.close(); inFromUser.close(); clientSocket.close(); } } //PHP Server code: <?php /* Simple php echo page */ // ini_set('display_errors', 'On'); // error_reporting(E_ALL | E_STRICT); if(isset($_GET['source'])) { if ($_GET['source'] == "raw") echo file_get_contents(basename($_SERVER['PHP_SELF'])); else echo "
" . htmlspecialchars(file_get_contents(basename($_SERVER['PHP_SELF']))) . "

"; } else if (isset($_GET['message'])){ echo strtoupper( htmlspecialchars($_GET['message'])) . '\n'; } else { ?> Error: No input message

No message

Echo server called without sending parameter

http服务器理解GET,POST,PUT,DELETE等字样。 所以这是一个问题:

  outToServer.writeBytes(sentence + "\n"); outToServer.writeChars("GET /echo.php HTTP/1.1" +"\n"); 

那里的第一个声明告诉http服务器它不理解的东西:句子。 注释掉该行和您的请求是否有效,您将得到回复。

我想你想把这个句子作为参数发布到echo服务。 您可以将它放在查询字符串中:

  outToServer.writeChars("GET /echo.php?message=" + sentence + " HTTP/1.0\n\n"); 

我还改变了HTTP版本,并附加了一个额外的\ n,正如Steffen Ullrich的评论所指出的那样:

此外,您必须添加空行以标记标题的末尾。 行结尾必须是\ r \ n而不是\ n。 你应该更好地做HTTP / 1.0请求而不是HTTP / 1.1,因为你的代码既不能处理HTTP keep-alive也不能处理HTTP chunked编码

但是,这还不够。 您还需要编码一些字符,例如空格。 必须对get请求中的URL进行编码,如@zapl在注释中所指出的那样。

我还建议首先使用简单的telnet测试你的echo服务:

 telnet localhost 8000 

在那里,您可以输入您的消息,“GET /echo.php?message=something”并validation它是否有效。 一旦找到按预期工作的内容,就可以相应地更新Java代码。