2011-07-12 44 views
2

我的問題是getInputStream()掛起時,我試圖打開一個流發佈到服務器後。用python編寫的服務器給出了一個錯誤消息,導致我相信它無法正確解析我的查詢字符串。請幫我診斷這個問題。getInputStream()掛在POST請求

我張貼與下面的代碼的Web服務器:

String boundarySolo = "--158211729626281"; 
String boundary = boundarySolo + "\r\n"; 
String contentHeader = "Content-Disposition: form-data; name=\""; 
URL requestUrl; 
URLConnection connection; 
String queryString = new String(); 

try{ 
    requestUrl = new URL(config.getServerUrl()); 
    connection = requestUrl.openConnection(); 
    connection.setReadTimeout(1000); 
    connection.setDoOutput(true); 
    connection.setDoInput(true); 

    connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundarySolo); 

。 。 。

outStream = new DataOutputStream(connection.getOutputStream()); 

    System.out.println("Writing bytes..."); 
    outStream.writeUTF(queryString); 
    System.out.println("Bytes written"); 
    outStream.flush(); 
    System.out.println("Buffer flushed."); 
    outStream.close(); 
    System.out.println("Stream closed."); 

    try{ 
    inStream = new DataInputStream(connection.getInputStream()); 
    String buffer; 

    System.out.println("Entering the loop."); 

    while((buffer = inStream.readLine())!= null) 
     System.out.println(buffer); 

    System.out.println("Leaving the loop."); 

    } 
    catch (SocketTimeoutException e) { 
    System.out.println("Socket timed out."); 
    } 

查詢字符串由這個(與\r\n在每一行的末尾):

--158211729626281 
    Content-Disposition: form-data; name="view" 

    a 
    --158211729626281 
    Content-Disposition: form-data; name="termdb" 

    Saccharomyces_cerevisiae.etd 
    --158211729626281 
    Content-Disposition: form-data; name="raw_weights" 

    blank 
    --158211729626281 
    Content-Disposition: form-data; name="MAX_FILE_SIZE" 

    256 
    --158211729626281 
    Content-Disposition: form-data; name="cutoff_Evalue" 

    0.01 
    --158211729626281 
    Content-Disposition: form-data; name="min_term_size" 

    2 
    --158211729626281 
    Content-Disposition: form-data; name="effective_tdb_size" 

    0 
    --158211729626281 
    Content-Disposition: form-data; name="stats" 

    wsum 
    --158211729626281 
    Content-Disposition: form-data; name="transform_weights" 

    null 
    --158211729626281 
    Content-Disposition: form-data; name="cutoff_type" 

    none 
    --158211729626281 
    Content-Disposition: form-data; name="output" 

    tab 
    --158211729626281-- 
+0

什麼錯誤訊息您在服務器獲取呢?然後,您可能希望將其重新構建爲Python目標問題。 – BalusC

回答

0

嘗試使用類似http://apikitchen.com/ 的東西來測試您的有效負載並查看返回的內容。

另一種方法是避免自己完成此操作。 HTTPClient,Jersey Client和Resty(我是作者)解決了這個問題,而不必深入到HTTP和MIME類型的深處。

下面是一個例子Resty讓你開始:

import us.monoid.web.Resty; 
import static us.monoid.web.Resty.*; 

Resty r = new Resty(); 
String result = r.text(config.getServerUrl(), 
     form(data("MAX_FILE_SIZE","256"), 
      data("stats", "wsum"),...etc.etc.).toString(); 

(假設文本/ *正在由服務器返回)

+0

我最終使用HttpClient。謝謝。 –

6

如果我沒記錯的話,URLConnection的#的getInputStream()實際上是用於發送請求到服務器(如果寫入輸出流的請求不夠大而不能導致刷新)。然後掛起,直到從服務器刷新響應。

你可以在服務器上進行調試嗎?這樣你就可以知道它到底有多遠以及爲什麼連接保持打開狀態。如果服務器要關閉連接,我希望在客戶端發生異常。

如果您使用的是Eclipse,請使用Window菜單 - > Show View - > Other並選擇TCP/IP Monitor。你可以使用它來真正看到通過電線發送的內容。

+3

+1提示到Eclipse內部的TCP/IP監視器 –

+0

以防萬一:如果你想要TCP/IP監視器,你需要在Eclipse中安裝Web Developer Tools – golimar