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