2011-08-13 10 views
0

HttpClientでpost.xmlを取得するためのアンドロイドアプリを開発したいと思います。しかし、それは80ポートでコンテンツを取得できませんでした。アンドロイドアプリがHttpClientで80ポートでコンテンツを取得できませんでした

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 Appは長さがコンテンツを取得できないため、それは

。さらに、応答がresponsep.getStatusLine()と "HTTP/1.1 200 OK" である。
このURIが正しくブラウザ(PCとAndroidエミュレータの両方)で開くことができる。ここで-1だそれはと関連しています"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(); 

//次の2つの別々の問題を持っているように見えるコンテンツ

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

答えて

0

のな長さを印刷します。

WEBrickに上の問題は、UNIX/Linuxがチェックするには、2つの明白なものがありますあなたのWebサーバがポート80にバインドすることはできないということのようだ:

  • はで実行しているWebサーバーですポートにバインドしようとすると、ルート権限が失われますか?この問題を回避するさまざまな方法については、Is there a way for non-root processes to bind to "privileged" ports on Linux?を参照してください。

  • すでに他のアプリケーションがポート80にバインドされていますか?そうです、それを殺し、あなたのWebサーバーをもう一度実行しようとします。


Nignxの問題点が異なっています。ここでは、サーバーが起動して実行中で、クライアントの応答が表示されますが、クライアントは内容の長さとして-1と表示されています。

これは正常な動作です。 getContentLength()メソッドは、レスポンスに "Content-length"ヘッダーがない場合は-1を返し、このヘッダーを持たないレスポンスの場合は(HTTP仕様に従って)完全に合法です。 2つの選択肢があります。

  • コンテンツの長さが指定されていない場合に対処するようにクライアント側のアプリケーションを変更します。例えばバッファーに本体を読み込んで何バイト持っているかを数えてください。

  • 関連するヘッダーを設定するようにサーバーを変更します。


フォロー私が見

。あなたの元の質問は理解するのが難しく、私は誤解しました。あなたはWEBrickがまったく動いていないと言っているようでした。

WEBrickとNginxの違いは、単純に応答を別々に実装していることです。どちらも正当な(有効な)実装です。実際の問題は、Webサーバーが常に「Content-length」ヘッダーを設定することをアプリケーションが想定していることです。これはが間違っています。の前提です。

繰り返すには、問題/障害はNginxではなくクライアントコードにあります。あなたの説明から

+0

Stephen C so much!ありがとうございました!ええ、私は80ポートでWEBrickを始めました。それはうまく動作します。だからポートとは何の関係もない。違いはNginxとWEBrickの間のWebサーバーです。 – Leslin

+0

私は、firebugを使ってヘッダとレスポンスを分析し、Nginxのヘッダにcontent-lengthが含まれていないことを確認します。あなたが言ったように、それはここで-1を返します。対照的に、WEBrickからの応答は内容の長さを持っています。 – Leslin

+0

@Leslin - そうだね。あなたの元の質問は理解するのが難しく、私は誤解しました。あなたはWEBrickがまったく動いていないと言っているようでした。 WEBrickとNginxの違いは、単純に応答を別々に実装することです。どちらも正当な(有効な)実装です。実際の問題は、Webサーバーが常に「Content-length」ヘッダーを設定することをアプリケーションが想定していることです。それは**間違った**仮定です。 –

1

は、私はあなたがからadroid ポート80に接続された外部HTTPサーバに接続しようとしていることを理解できますか?もしそうなら、アンドロイドの1024未満のポートに関する制限は何もしていません(あなたはアンドロイドデバイスのポート80でリッスンしようとしていません)。私はあなたがNginxに問題があると思う。

外部マシンからNginxにGETリクエストを実行し、応答内容(ヘッダー、ペイロード)を調べてみます。私の代わりに、Webブラウザのいくつかのより低レベルのツールでそれを行うことをお勧めします例えば、カールのために、(最近はほとんどすべてのWebブラウザを「修理」違法サーバ応答することができます):

カール-D - http://192.168.1.103/posts.xml

+0

Piotreck Deに感謝します。あなたは正しいです。問題はNginxでなければなりません。良い週末を。 – Leslin

関連する問題