writeObject后无法使用Socket中的InputStream

时间:2013-07-08 22:20:19

标签: java sockets objectoutputstream

情况如下: 我有一个ServerSocket ss,和“Socket socket = ss.accept();”,如果我这样做:

istream = socket.getInputStream();
ostream = socket.getOutputStream();   
in = new BufferedReader(new InputStreamReader(istream));
out = new PrintWriter(new BufferedOutputStream(ostream));
/*
  I use in/out few times
  everything OK

*/
ObjectOutputStream oos = new ObjectOutputStream(ostream);
oos.writeObject(someobject);
/* probably code that solves the problem */
String line = in.readLine();

在客户端,我有这段代码:

PrintWriter out = new PrintWriter(new BufferedOutputStream(socket.getOutputStream()),true);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
/*
    using in/out, no problems
*/
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
SomeObject so = (SomeObject)ois.readObject();
out.println("some text");

一切都很好,直到我发送一些对象。客户端正确接收对象,没有问题。但我不能再使用套接字了。如果我执行oos.close(),我会得到“套接字关闭”的异常。如果我做oos.reset()我得到类似消息的异常。 “套接字重置”。所以我该怎么做?在writeObject()之后可以使用相同的输入和输出流吗?

当我发送“一些文本”时会发生什么,无论我多少次调用readLine(),我都会得到空值,我从来没有得到“某些文本”。

1 个答案:

答案 0 :(得分:0)

您不能在同一底层套接字上使用多种类型的流/读取器/写入器。你的所有流,读者和作者都被缓冲,所以他们都会彻底混淆。坚持口气。坚持一个协议。如果您有对象流,请将它们用于所有内容。并且在套接字的生命周期中创建它们一次,而不是根据消息创建它们。