2011-08-13 32 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

相关问题