2015-11-01 63 views
1

我的问题很简单,乍一看虽然不是。我的android应用程序使用方法writeObject()通过ObjectOutputStream(OOS)发送对象。 一切都很好,直到我试图在短时间内发送几个对象(看起来像那件事)。所以,想象,我不喜欢水木清华:ObjectOutputStream在一行中读取多个对象

服务器端:

public void someMethod(){ 
    sendObjectA(objA); 
    sendObjectB(objB); 
} 

public void sendObjectA(ObjectA obj){ 
    getObjectOutputStream().writeObject(obj); 
    getObjectOutputStream().flush(); 
} 

public void sendObjectB(ObjectB obj){ 
    getObjectOutputStream().writeObject(obj); 
    getObjectOutputStream().flush(); 
} 

客户端

public void method read(){ 
    while (true){ 
     Object receivedObject = inputStream.readObject(); 
     if (receivedObject instanceof ObjectA){ 
       doAThings(); 
     } else if (receivedObject instanceof ObjectB){ 
       doBThings(); 
     } 
} 

...捕获异常等

而且它发生在某种程度上是doAThings()方法永远不会被调用,它看起来更像是这个objectA永远不会来。

在调试过程中,我注意到,在我写入objA到流之后,程序开始向它写入objB(当然,很明显的行为,但是...)但客户端没有收到objA(我也尝试调试客户端)。我把一个断点在该行

Object receivedObject = inputStream.readObject(); 

而且只当它收到objB停止。

没有引发任何异常,logcat中没有错误(如nonSerializable等),没有任何异常。

另外我想补充一点,我不会那么满意接受某种解决方法。我真的很想了解问题的根源。我已经阅读了大量不同的教程,关于Java IO,流等的文档,但仍然不知道为什么会发生这样的事情。例如,flush()方法应该刷新任何写入的数据,即将其传递到目标点,但在我的情况下它不会。它看起来只是用新的数据覆盖以前写入的数据。

P.S.我也使用套接字,所以接收器 - 是通过Wi-Fi连接的设备

回答

0

听起来好像你在你的ObjectOutputStream和套接字之间有BufferedOutputStream。虽然这是一个好主意,它意味着:

  • 您需要直接冲洗()的ObjectOutputStream您构建后,并试图构建相应ObjectInputStream
  • 之前,如果你想对阅读对象作为你没有滞后地产生它们,你需要在每个writeObject()呼叫后冲洗ObjectOutputStream
+0

谢谢你的回答。那么,在我将它们写入流之后,我会立即刷新objectoutputstream。但是,你的意思是“你需要在构造它之后直接刷新()ObjectOutputStream”?你能解释一下这个是什么意思,它会是什么样子? –