2012-08-09 32 views
2

我有一个服务器 - 客户端设置在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。这似乎导致比解决方案更多的问题。任何其他想法?

+0

除了创建并关闭它们之外,该方法是唯一访问'out'或'socket'的地方吗? – 2012-08-09 18:34:07

+0

@JoachimIsaksson:sendMsg方法实际上包含在另一个跟踪所有I/O变量的对象中。这个方法在我的进程中被多个线程调用。在这些线程中唯一调用的其他方法只调用'in.readObject()',它有一个超时。 – 2012-08-09 19:35:00

回答

2

这听起来像是你正在以多线程的方式写入输出流,也就是说,你正在写一个地方,而不是你的例子。

顺便说一句:你是否定期重置()流,以防止内存泄漏?

+0

是的,我从多个线程调用sendMsg()。这有问题吗?另外,我还没有定期重置()流。我如何/何时这样做以免失去从另一个线程发送的信息? – 2012-08-09 19:37:00

+0

如果在对象序列化时更改对象,则可能会破坏流。对象流会记住它发送的每个对象。使用reset()清除两端的缓存。 – 2012-08-09 19:49:54

+0

这是否适用于嵌套对象?我正在发送一个SignedObject,其中包含一个消息,其中包含的数据在某些时候会发生变化。如果是这种情况,那么我的数据流量增加可能会延迟传输足够长的时间,从而产生影响。 – 2012-08-09 20:03:19

相关问题