簡體   English   中英

Java:使用TCP套接字的簡單http GET請求

[英]Java: Simple http GET request using TCP sockets

我在本地托管一個簡單的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 "<pre>" . htmlspecialchars(file_get_contents(basename($_SERVER['PHP_SELF']))) . "</pre>";
      } else if (isset($_GET['message'])){
        echo strtoupper( htmlspecialchars($_GET['message'])) . '\n';
      } else {
?>
      <html>
        <head>
          <title>Error: No input message</title>
        </head>
        <body>
          <h1> No message</h1>
          <p>Echo server called without sending parameter</p>
        </body>
      </html>
<?php
      }
?>

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”並驗證它是否有效。 一旦找到按預期工作的內容,就可以相應地更新Java代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM