如何在java中的一个套接字上发送多个对象?

时间:2015-06-07 00:58:57

标签: java sockets serialization

当我通过套接字只发送一个对象时,我很好。但是当我试图发送两个对象时,我得到了

Exception in thread "main" java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(Unknown Source))

我已经尝试了几乎所有类似flush()或reset()但没有一个工作。

public String SendObject(Object o) throws IOException {
    OutputStream outToServer = client.getOutputStream();
    ObjectOutputStream out = new ObjectOutputStream(outToServer);
    out.writeUnshared(o);
    InputStream inFromServer = client.getInputStream();
    DataInputStream in = new DataInputStream(inFromServer);
    return in.readUTF();
}

3 个答案:

答案 0 :(得分:1)

您正在使用ObjectOutputStream从客户端编写Object。您应该使用ObjectInputStream(而不是DataInputStream)在服务器上阅读它们。阅读两个Object可能看起来像,

InputStream inFromServer = client.getInputStream();
ObjectInputStream in = new ObjectInputStream(inFromServer);
Object obj1 = in.readObject();
Object obj2 = in.readObject();

此外,在客户端上,我认为你想要writeObject(而不是writeUnshared

ObjectOutputStream out = new ObjectOutputStream(outToServer);
out.writeObject(o);

答案 1 :(得分:1)

虽然其他答案(例如@ EJP)对于发送/接收对象和处理流的正确方法是正确的,但我认为直接问题出在服务器端:

Exception in thread "main" java.net.SocketException: Connection reset

这似乎是说在客户端收到响应之前连接已断开。当客户端尝试读取时,它会看到损坏的(重置)连接并抛出异常。

如果(如你所说)sendObject方法第一次工作,那么我怀疑服务器端正在关闭其输出流以“刷新”响应......或类似的东西。

答案 2 :(得分:0)

  1. 您必须在套接字的生命周期中使用相同的流,而不是每次发送(或接收)的新流。
  2. 您需要在对象流和数据流之间做出决定。不要混合它们。
  3. 请勿尝试在writeObject()/writeUnshared()readUTF().
  4. 之间进行混音