我需要通过序列化将一个Object从客户端发送到服务器 这是我的代码:
HttpURLConnection con = null;
ObjectOutputStream out = null;
ObjectInputStream inputStream = null;
URL servlet = new URL("MY_URL");
con = (HttpURLConnection) servlet.openConnection();
con.setDoInput(true);
con.setDoOutput(true);
con.setUseCaches(false);
con.setDefaultUseCaches(false);
con.setRequestProperty("Content-type", "application/octet-stream");
con.setRequestMethod("POST");
out = new ObjectOutputStream(con.getOutputStream());
out.writeObject(myobject);
out.flush();
out.close();
inputStream = new ObjectInputStream(con.getInputStream());
inputStream.close();
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
// inputStream.close();
con.disconnect();
}
return true;
现在,我能够到达Servlet,我可以通过那里检索对象 唯一的问题是,一旦我到达这一行:
inputStream = new ObjectInputStream(con.getInputStream());
我在客户端遇到异常StreamCorruptedException。 (在服务器端,一切都很棒!)
如果我关闭这一行,则不会触发servlet(我的意思是在servlet中没有调用doGet()
或doPost()
)
我做错了什么?
这是确切的错误:
06-02 12:41:53.549: WARN/System.err(4260): java.io.StreamCorruptedException
06-02 12:41:53.549: WARN/System.err(4260): java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:2399)
06-02 12:41:53.549: WARN/System.err(4260): at java.io.ObjectInputStream.<init>(ObjectInputStream.java:447)
谢谢,
射线
答案 0 :(得分:4)
客户端期望servlet将对象写回响应,如:
ObjectOutputStream oos = new ObjectOutputStream(response.getOutputStream());
oos.writeObject(someObject);
但是servlet显然实际上没有写回任何对象。所以客户端不应该使用ObjectInputStream
来装饰它。就这样做:
InputStream inputStream;
// ...
inputStream = connection.getInputStream();
或只是
connection.connect();
如果你对这个回复不感兴趣的话。连接仅按需执行。 getInputStream()
将隐式执行此操作。这就是为什么在您致电getInputStream()
之前未触发请求的原因。另请参阅this answer以获取更多提示。
答案 1 :(得分:0)
不要自己做这些东西,看看HttpClient和Spring的HttpInvoker。