在java中,如何通过一个套接字发送多个对象?

在java中,如何通过一个套接字发送多个对象?,java,sockets,serialization,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 IOExceptio

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

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

您正在使用
ObjectOutputStream
从客户端写入
对象。您应该使用(而不是
DataInputStream
)在服务器上读取它们。要读取两个
对象
s可能看起来像

InputStream inFromServer = client.getInputStream();
ObjectInputStream in = new ObjectInputStream(inFromServer);
Object obj1 = in.readObject();
Object obj2 = in.readObject();
另外,在客户机上,我认为您希望
writeObject
(而不是)像

  • 在套接字的生命周期中必须使用相同的流,而不是每次发送(或接收)都使用新的流
  • 您需要在对象流和数据流之间做出决定。不要把它们混在一起
  • 不要试图混用
    writeObject()/writeUnshared()
    readUTF()。
  • 虽然关于发送/接收对象和处理流的正确方式,其他答案(例如@EJP)是正确的,但我认为最直接的问题在于服务器端:

    Exception in thread "main" java.net.SocketException: Connection reset
    
    这似乎是说,在客户端收到响应之前,连接已断开。当客户端尝试读取时,它会看到断开(重置)的连接并抛出异常


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

    您如何发送一个对象?帖子代码。请用你的代码(格式正确)编辑你的原创帖子。不要把它放在评论里。另外,请包括您收到的确切错误。但是,当我只发送一个对象时,为什么它会起作用呢?我尝试了
    WriteObject
    ,我也尝试了同样的方法results@orestiskim你检查过Javadoc吗?在这里使用
    writeUnshared()
    没有问题:的确,如果他计划重新发送对象,这是个好主意。那么你有什么建议?我建议你看看服务器端正在做什么。
    Exception in thread "main" java.net.SocketException: Connection reset