2013-10-12 73 views
0

我正在嘗試製作一個可以接受GET和POST HTTP請求的java服務器。現在我設法讓GET方法起作用。但我沒有設法讓POST方法工作。我的服務器設法讀取請求頭,但似乎沒有讀取消息的正文。即發佈的內容。這裏是代碼:讓HTTP POST在製作自己的Java服務器時工作

int port = 1991; 

     ServerSocket serverSocket = new ServerSocket(port); 

     System.err.println("The Server is on and listening on port " + port); 
     System.out.println(" "); 

     while (true) 
     { 
      Socket ClientSocketConnection = serverSocket.accept(); 
      System.err.println("We have established a connection with a client!"); 
      System.out.println(" "); 

      BufferedReader ServerInput = new BufferedReader(new InputStreamReader(ClientSocketConnection.getInputStream())); 
      DataOutputStream ServerOutput =new DataOutputStream(ClientSocketConnection.getOutputStream()); 

      String StringInput; 
      int iCount = 0; 
      int CountNull = 0; 

      while ((StringInput = ServerInput.readLine()) != null) 
      { 

       System.out.println(StringInput); 
      } 

現在我只顯示通過套接字發送的所有東西。但由於某些原因,我只是不明白的請求消息的身體,我知道身體是因爲在鉻送我有這樣的:

enter image description here

我不知道怎麼去說,「表單數據」。任何幫助將非常感謝!

UPDATE:

這裏的問題是進一步收窄。從發送HTTP請求罰款。使用HTTP POST方法,我們將請求標頭設爲\ r \ n,然後是消息數據。問題是當我的BufferedData變量ServerInput讀入\ r \ n(空行)時,它停止從ServerInput讀取數據。有任何解決這個問題的方法嗎?

+0

您是否收到「Content-length」標頭?如果是這樣,那麼在讀取一個空行(表示頭部分的結尾)後,讀取_Content-length_字節數並將它們轉換爲字符串。你的問題可能是在你的ServerInput的末尾沒有行結束,因此readLine()會永遠等待它。 – halfbit

+0

事實上,我確實得到了12的Content-Legnth。我現在會嘗試你的建議 – user481610

回答

0

正如在帖子中提到的那樣,我遇到的問題是我製作的服務器讀取了HTTP請求標題,但是一些從未設法讀取通過Google Chrome發送到服務器的發佈信息。

現在HTTP POST請求的結構如下:

request header 
\r\n 
post information 

的理由讓我不能夠讀取該發佈信息是.readLine()功能,因爲!一旦函數讀入一個\ r \ n,它會假定這是消息的結尾,並停止讀取正在發送的發佈信息,從而導致錯誤。要解決這個問題,我不得不使用.read()函數而不是.readLine().read()函數從HTTP請求中讀取每個字符,其中包含發佈信息

2

您需要閱讀有關HTTP協議。你可以看看HttpServlet API。

servlet的目的正在從套接字傳遞到Http協議。你確定你想再次做這項工作嗎?

+0

這是一個學校作業,所以我不完全確定我們是否可以使用servlet,但我會研究它。 – user481610

+0

可以下載rt源代碼並仔細查看servlet API:這將使您瞭解很多關於良好體系結構的知識。 如果你匆忙,只需閱讀一些關於HTTP協議的文檔來理解標題信息(POST,GET,UPDATE等...命令寫在標題中)。您可以在Firefox上使用Firebug插件來查看http請求中發生的情況並提供標題示例 –

0

我強烈建議你看看Jetty。這是一個可嵌入的http服務器,它將爲你抽象出所有這些內容。