我有一个服务器 - 客户端设置在TCP上,客户端正在向服务器发送一些数据集。读/写使用ObjectInput/OutputStream。在正常情况下我没有任何问题,但是当数据流量变大时,我得到一个StreamCorruptedException:无效的类型代码。无效的代码每次都不相同。我打开一次套接字并调用同步方法从多个线程发送数据。StreamCorruptedException ObjectInputStream上的数据量过大
客户:
socket = new Socket("localhost", sockNum);
out = new ObjectOutputStream(socket.getOutputStream());
in = new ObjectInputStream(socket.getInputStream());
public synchronized void sendMsg(Message msg){
try{
out.writeObject(security.signObject(msg, privKey));
out.reset();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
服务器:
ServerSocket server = new ServerSocket(sockNum);
Socket client = server.accept();
ObjectInputStream in = new ObjectInputStream(client.getInputStream());
while(threadActive){
Object line = in.readObject();
handleObject(line);
}
更新:我添加out.reset()后,每发,但这并没有帮助的问题。我还在循环中添加了睡眠状态以降低数据速率。这摆脱了错误,但不是一个真正的解决方案。
编辑:自从我最初提出这个问题以来有一段时间了,但我再次遇到了问题。我尝试设置我的系统,以便在每次发送消息后,线程都会等待“确认”消息作为回报。如果接收进程发生StreamCorruptedException,它将发送一个“重发”而不是ack。这似乎导致比解决方案更多的问题。任何其他想法?
除了创建并关闭它们之外,该方法是唯一访问'out'或'socket'的地方吗? – 2012-08-09 18:34:07
@JoachimIsaksson:sendMsg方法实际上包含在另一个跟踪所有I/O变量的对象中。这个方法在我的进程中被多个线程调用。在这些线程中唯一调用的其他方法只调用'in.readObject()',它有一个超时。 – 2012-08-09 19:35:00