Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 由HTTPClient终止的BufferedReader_Java_Android_Http - Fatal编程技术网

Java 由HTTPClient终止的BufferedReader

Java 由HTTPClient终止的BufferedReader,java,android,http,Java,Android,Http,所以我有一个服务器和一个客户端 服务器发送如下消息 public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException StringBuilder builder = new StringBuilder(); resp.setContentType("text/plain"); DO A LOT OF THINGS AND WRITE IT INTO

所以我有一个服务器和一个客户端

服务器发送如下消息

public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException        
   StringBuilder builder = new StringBuilder();
   resp.setContentType("text/plain");

      DO A LOT OF THINGS AND WRITE IT INTO ONE JSONARRAY

   builder.append(JsonArray.toString());
   resp.getWriter().println(builder);
}
客户收到如下信息:

 private class GetXMLTask extends AsyncTask<String, Void, String> {
    @Override
    protected String doInBackground(String... urls) {
        String output = null;
        for (String url : urls) {
            output = getOutputFromUrl(url);
        }
        return output;
    }

    private String getOutputFromUrl(String url) {
        String output = null;
        try {
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpGet httpGet = new HttpGet(url);

            HttpResponse httpResponse = httpClient.execute(httpGet);
            HttpEntity httpEntity = httpResponse.getEntity();

            InputStream in = httpEntity.getContent();
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));

            String line = "";
            StringBuilder builder = new StringBuilder();

            while ((line = reader.readLine()) != null) {
                builder.append(line + "\n");
            }
            Log.i("Test", builder.toString());
            in.close();

            httpClient.getConnectionManager().shutdown();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return output;
    }
私有类GetXMLTask扩展了AsyncTask{
@凌驾
受保护的字符串doInBackground(字符串…URL){
字符串输出=null;
for(字符串url:url){
输出=getOutputFromUrl(url);
}
返回输出;
}
私有字符串getOutputFromUrl(字符串url){
字符串输出=null;
试一试{
DefaultHttpClient httpClient=新的DefaultHttpClient();
HttpGet HttpGet=新的HttpGet(url);
HttpResponse HttpResponse=httpClient.execute(httpGet);
HttpEntity HttpEntity=httpResponse.getEntity();
InputStream in=httpEntity.getContent();
BufferedReader reader=新的BufferedReader(新的InputStreamReader(in));
字符串行=”;
StringBuilder=新的StringBuilder();
而((line=reader.readLine())!=null){
builder.append(第+行“\n”);
}
Log.i(“Test”,builder.toString());
in.close();
httpClient.getConnectionManager().shutdown();
}捕获(不支持的编码异常e){
e、 printStackTrace();
}捕获(客户端协议例外e){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
返回输出;
}
客户端从异步任务获取数据

问题是客户端没有从服务器接收到整个发送。我试图创建一个reader.read(),但也存在同样的问题

如果我试图通过浏览器获取代码,我会从服务器接收所有数据,但在我的java应用程序中我不会。 因此服务器是完全正确的,也许我可以更改jsonarray并在每个jsonobject之后添加一个\n

logcat可能有问题,因为它的字符串有问题,因为字符串太长了

谢谢你的帮助

编辑: 关闭

在方法“getOutputFromUrl”中,没有为“输出”分配任何内容

刷新响应编写器并将其关闭,以确保整个字符串一致地写入套接字。此外,在返回输出之前,请分配输出值。

问题在于:

Stringbuilder拥有所有功能,但LogCat无法显示这些功能

这是同样的问题

为了在LogCat中显示stringbuilder,我制作了子字符串

builder.substring(0,4000);
builder.substring(0,builder.length());

感谢您的帮助!

您是否尝试记录收到的字符串的结尾?为了消除您的LogCat作为可能的错误源?此外,您确实应该使用它来读取HTTP响应数据,这是一个高效的单行代码。我尝试获取文件结尾,BufferedReader返回null,因此它结束了!如果我使用java程序,我得到了4063字节,它结束了。使用浏览器,我收到了5582字节的全部数据。您可能想尝试刷新服务器端的写入程序。另外,您是否尝试了
EntityUtils
类在客户端读取?5582也是json数组打印的长度,它在服务器写入之前发出!是的,但是我不需要输出,我尝试在LogCat中提供数据。输出用于AsyncTasktry Puting Log.I after in.close()。关闭流也会刷新它。虽然优雅地关闭流(try-catch-finally)会更干净一些,但我会刷新它,但不起作用
builder.substring(0,4000);
builder.substring(0,builder.length());