Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 重复写入ObjectInputStream_Java_Sockets_Serialization_Objectinputstream - Fatal编程技术网

Java 重复写入ObjectInputStream

Java 重复写入ObjectInputStream,java,sockets,serialization,objectinputstream,Java,Sockets,Serialization,Objectinputstream,我有多个客户端和一个服务器。服务器在一个线程中处理每个客户机。客户端必须向主机发送一个custon对象。我检查了和,它讨论了错误java.io.StreamCorruptedException:invalid type code:AC,这正是我所遇到的 但我不理解提议的解决方案。他继承ObjectOutputStream,simple不会在必须发送对象的第二次和后续时间写入头。这对我不起作用 是否有另一种通过TCP套接字发送自定义对象的解决方案?我的客户每10秒收集一次数据,然后重新创建发送的对

我有多个客户端和一个服务器。服务器在一个线程中处理每个客户机。客户端必须向主机发送一个custon对象。我检查了和,它讨论了错误
java.io.StreamCorruptedException:invalid type code:AC
,这正是我所遇到的

但我不理解提议的解决方案。他继承ObjectOutputStream,simple不会在必须发送对象的第二次和后续时间写入头。这对我不起作用

是否有另一种通过TCP套接字发送自定义对象的解决方案?我的客户每10秒收集一次数据,然后重新创建发送的对象

很抱歉,如果我重复的话,我读了很多类似的问题,但没有找到我的场景的答案

提前谢谢

编辑

发送方法(在客户端中)


ObjectInputStream和ObjectOutputStream是有状态的。所以你需要匹配他们的生命周期。您是否在每台客户机每次发送对象网络时(即每10秒)都在其中实例化一个新的输出流?因此,最好在服务器中实例化相应的输入流。请注意,这是最安全、最干净的选项,但它会通过网络发送更多数据


另一方面,如果你要保持溪流畅通,那么你需要担心几件事。首先,您是否只发送不可变的对象?否则,您可能无法传递所需的内容(序列化只写入每个对象一次,然后写入对先前序列化的对象的引用)。

在套接字的生命周期内,在两端使用相同的
ObjectOutputStream
ObjectInputStream
,并查找
ObjectOutputStream reset()
和writeUnshared()方法


有关讨论,请参阅。

有状态并不是您需要匹配生命周期的唯一原因:有一个流头,它是AC的源;每次写入和读取时使用新流不是“最安全、最干净的选择”。@EJP,我不是指每次写入。更像是松散意义上的每笔“交易”。基本上,如果您最终重新编写了一个自第一次写入以来发生了更改的对象,那么您就是在自找麻烦。一点也不,您只需在希望重新发送它时调用reset(),或者在每次“事务”之前调用reset()。所以我应该在发送/接收方法之外实例化它们?比如在构造器中?嗯,显然它起作用了:)提前谢谢,我还得继续研究这些streams@PedroDusso做得好。事实上,在套接字的生命周期中,无论它们是什么类型,您都应该始终使用相同的流/读卡器/写卡器,这是出于缓冲原因,也是为了节省工作量。
    public void TCPEchoClientSend(MonitoredData _mData) throws IOException {
        if (_mData == null)
            throw new IllegalArgumentException("Parameter: <Monitored Data> empty.");           
        ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());

        // Send the encoded object to the server
        oos.writeObject(_mData);

        oos.close();

        System.out.println("Client sent the monitored data package.");

    }
public static void handleEchoClient(Socket client, Logger logger) {
        try {
            MonitoredData mdata;
            // Get the input and output I/O streams from socket
            ObjectInputStream ois = new ObjectInputStream(client
                    .getInputStream());
            ObjectOutputStream oos = new ObjectOutputStream(client
                    .getOutputStream());

            // Receive until client closes connection, indicated by -1;
            while ((mdata = (MonitoredData) ois.readObject()) != null) {

                System.out.println("Got received data. Ready to save.");

                hdb.saveOrUpdate(mdata);

                System.out.println("Monitored Data arrived at home.");

            }

            // logger.info("Client " + _clntSock.getRemoteSocketAddress()+
            // ", echoed " + totalBytesEchoed + " bytes.");

        } catch (IOException ex) {
            logger.log(Level.WARNING, "Exception in echo protocol", ex);
        } catch (ClassNotFoundException e) {
            logger.log(Level.WARNING, "Exception in echo protocol", e);
        } finally {
            try {
                client.close();
            } catch (IOException e) {
            }
        }
    }