【问题标题】:ObjectOutputStream read multiple Objects in a rowObjectOutputStream 连续读取多个对象
【发布时间】:2016-02-01 16:42:35
【问题描述】:

乍一看,我的问题很简单,但事实并非如此。我的 android 应用程序使用方法 writeObject() 通过 ObjectOutputStream (OOS) 发送对象。 一切都很好,直到我尝试在短时间内发送几个对象(看起来很重要)。所以,想象一下我会喜欢:

服务器端:

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() 方法应该刷新任何写入的数据,即 DELIVER 将其发送到目标点,尽管在我的情况下它没有。看起来它只是用新的数据覆盖以前写入的数据。

附:我也在使用插座,所以接收器 - 是通过 Wi-Fi 连接的设备

【问题讨论】:

    标签: java android sockets serialization objectoutputstream


    【解决方案1】:

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

    • 您需要在构造ObjectOutputStream之后直接对其进行flush(),然后再尝试构造相应的ObjectInputStream
    • 如果您希望对等方在您生成对象时读取对象而没有延迟,则需要在每次writeObject() 调用后刷新ObjectOutputStream

    【讨论】:

    • 感谢您的回答。好吧,在我将它们写入流之后,我会立即刷新 objectoutputstream。但是,“您需要在构造 ObjectOutputStream 之后直接对其进行刷新()”是什么意思?你能解释一下这是什么意思吗?它是什么样子的?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-10
    • 1970-01-01
    • 2018-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多