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());