我有多个客户端和一个服务器。服务器在一个线程中处理每个客户端客户端必须向主服务器发送custon对象。我检查了this和this,其中谈到了我正在犯的错误java.io.StreamCorruptedException: invalid type code: AC
。
但我不理解建议的解决方案。他继承了ObjectOutputStream,并且在第二次以及随后必须发送对象的时间内不会写入标头。这不适合我。
是否有其他解决方案通过TCP套接字发送自定义对象?我的客户每隔10秒收集一次数据并重新创建发送的对象。
我很抱歉,如果我是重复的,我正在阅读很多类似的问题,但找不到我的情景的答案。
提前致谢
修改
发送方法(在客户端)
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) {
}
}
}
答案 0 :(得分:2)
在套接字的生命周期中使用相同的ObjectOutputStream
和ObjectInputStream
,并查找ObjectOutputStream reset()
和writeUnshared()方法。
请参阅this answer进行讨论。
答案 1 :(得分:-1)
ObjectInputStream和ObjectOutputStream是有状态的。所以你需要匹配他们的生命周期。您是否每次发送一个对象网络(即每10秒)在每个客户端中实例化一个新的输出流?是这样,您最好在服务器中实例化相应的输入流。请注意,这是最安全和最干净的选项,但它会通过网络发送更多数据。
另一方面,如果你要保持流,那么你需要担心几件事。首先,您只发送不可变对象吗?否则,您可能无法传达所需的内容(序列化只会将每个对象写入一次,然后将引用写入之前序列化的对象)。