2011-08-13 46 views
0

我想開發一個android應用程序來獲取post.xml與HttpClient。但它沒有得到80端口的內容。android應用程序無法獲取80端口的內容與HttpClient

如果我用3000端口啓動web服務器(WEBrick在這裏),則URI是http://192.168.1.103:3000/posts.xml; Android應用可以獲得正確長度的響應,如568;

相同的Web文件,我用80端口開始將它們與其他服務器(Nignx這裏),URI是 「http://192.168.1.103/posts.xml; Android應用無法與長度獲取內容,這是-1這裏。
這個URI可以用瀏覽器(PC和Android模擬器)正確地被打開。此外,回答是 「HTTP/1.1 200 OK」 與responsep.getStatusLine()。

是否與相關「1024以下的套接字端口不能訪問像Linux系統」,這是在 http://groups.google.com/group/android-developers/browse_thread/thread/660123ca64ba1229#

任何忍者可以告訴我,如果我可以做什麼,我應該怎麼做獲得80端口的內容?

以下是我的代碼。

public class AndroidWorldActivity extends Activity當活動首次創建時調用。 */

TextView tv; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState);   
    retreiveProjects(); 
} 


private void retreiveProjects() 
{ 
    HttpClient httpClient = new DefaultHttpClient(); 
    try 
    { 
    String url3000 = "http://192.168.1.103:3000/posts.xml"; 
    String url = "http://192.168.1.103/posts.xml"; 

    Log.d("posts", "performing get " + url3000); 
    HttpGet httpGet=new HttpGet(url3000); 

    HttpResponse responsep=httpClient.execute(httpGet);   
    System.out.println(responsep.getStatusLine()); 

    HttpEntity httpEntity = responsep.getEntity(); 
    int length = (int) httpEntity.getContentLength(); 

//打印內容

System.out.println("The content length is: "+length); 
    Log.d("posts", "The content length is: " + length); 

回答

0

的lenght你似乎有兩個獨立的問題。

上的WEBrick這個問題似乎是在UNIX/Linux會不會讓你的Web服務器綁定到80端口有兩個明顯的事情要檢查:


與Nignx的問題是不同的。在這裏,服務器已啓動並運行並給予客戶端響應,但客戶端將內容長度視爲-1

這是正常行爲。如果響應沒有「Content-length」頭,則getContentLength()方法返回-1,並且對於沒有此頭的響應它是完全合法的(根據HTTP規範)。您有兩種選擇:

  • 更改您的客戶端應用程序以處理內容長度未指定的情況;例如只需將身體讀入緩衝區並計算您獲得的字節數。

  • 更改服務器以設置相關標題。


隨訪

我明白了。你原來的問題很難理解,我誤解了。你似乎在說WEBrick根本不工作。

WEBrick和Nginx的區別在於它們只是簡單地實現了不同的響應。兩者都是合法的(有效)實施。真正的問題是,您的應用程序假設Web服務器將始終設置「Content-length」標頭。這是錯誤的假設。

重複一次,問題/錯誤出現在您的客戶端代碼中,而不是Nginx中。

+0

非常感謝Stephen C!是的,我開始使用80端口的WEBrick。它工作正常。所以這與端口無關。那麼Nginx和WEBrick之間的web服務器有什麼區別。 – Leslin

+0

我使用firebug來分析標題和響應,並發現Nginx的標題不包含內容長度。正如你所說,這就是爲什麼它在這裏返回-1。相反,WEBrick的響應具有內容長度。 – Leslin

+0

@萊斯林 - 我明白了。你原來的問題很難理解,我誤解了。你似乎在說WEBrick根本不工作。 WEBrick和Nginx的區別在於它們只是簡單地實現了不同的響應。兩者都是合法的(有效)實施。真正的問題是,您的應用程序假設Web服務器將始終設置「Content-length」標頭。這是**錯誤的假設。 –

1

從你的描述,我知道你正在試圖連接的Adroid 連接到端口80上的外部HTTP服務器?如果是這樣,關於Android上的端口低於1024的限制沒有任何關係(你不是試圖在Android設備上的端口80上聽)。我想,你對Nginx有問題。

嘗試從外部機器執行GET請求到Nginx並調查響應內容(標題,有效內容)。我會建議多帶些低層次的工具,而不是網頁瀏覽器(幾乎所有的Web瀏覽器現在都能夠「修理」非法服務器響應)做到這一點,例如捲曲:

捲曲-D - http://192.168.1.103/posts.xml

+0

感謝Piotreck De。你是對的。問題應該是Nginx。週末愉快。 – Leslin

相關問題