我正在以这种方式对来自android的servlet进行两次succssive调用:
//FIRST CONNECTION
URL url = new URL("http://172.16.32.160:8080/xyz/check_availability");
HttpURLConnection connection =(HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
ObjectOutputStream out=new ObjectOutputStream(connection.getOutputStream());
String a="xya";
String b="xsw";
out.writeObject(a);
out.flush();
ObjectInputStream in=new ObjectInputStream(connection.getInputStream());
String s=(String)
in.readObject();
in.close();
out.close();
Toast.makeText(getApplicationContext(), "1", Toast.LENGTH_LONG).show();
//SECOND CONNECTION
URL url1 = new URL("http://172.16.32.160:8080/xyz/check_availability");
HttpURLConnection connection1 = (HttpURLConnection)url1.openConnection();
connection1.setDoOutput(true);
ObjectOutputStream out1=new ObjectOutputStream(connection1.getOutputStream());
out1.writeObject(b);
out1.flush();
ObjectInputStream in1=new ObjectInputStream(connection1.getInputStream());
String str=(String)
in1.readObject();
in1.close();
out1.close();
Toast.makeText(getApplicationContext(), "2", Toast.LENGTH_LONG).show();
上面的代码很有效,因为我在关闭输入流后关闭了第一个连接的输出流。但是如果我在发送对象后关闭输出流,则第二个输入流会抛出异常:
java.io.StreamCorruptedException
关闭输入流后,为什么要关闭输出流?
注意
如果有人知道实际答案或正确的原因,为什么它在Android中不起作用,请回答。直到那时我会接受EJP给出的答案 - 这是android中的一个错误。
答案 0 :(得分:4)
看起来像Android中的一个错误。
在Java中出现这种情况,在ObjectOutputStream
之后随时关闭HttpURLConnection
除了刷新输出外没有任何作用(因为连接必须保持接收响应)。关闭HttpURLConnection
的输入流将关闭整个连接,因此后续关闭ObjectOutputStream
将无效。
我怀疑Android首先执行ObjectOutputStream.close()
时会对连接造成不良影响,例如关闭它。
我完全省略了ObjectOutputStream.close()
,你在任何一个平台都不需要它。 flush()
就足够了。