【问题标题】:How to read/write different types with an ObjectOutputStream如何使用 ObjectOutputStream 读取/写入不同类型
【发布时间】:2015-08-02 11:16:38
【问题描述】:

我希望能够使用我的对象输入/输出流在服务器和客户端之间发送布尔值、UTF 和对象。独立地,我发送字符串或布尔值没有问题,但是当我在 while 循环中有两个线程时,一个执行 .readBoolean 而另一个 .readUTF 错误被抛出。我可以明白为什么这种方式行不通,但我无法找出正确的方法。

如何通过流发送不同的类型?是否需要多个端口,或者我可以使用同一个流在一个端口上完成吗?

【问题讨论】:

  • 为什么要通过流发送两个对象?发送一个具有两个值的对象...例如。创建一个名为anything的新对象并使用ojbectstream发送任何内容并通过((anything)receivedobject).getString()读取对象;和 ((anything))receivedobject).getBoolean();这两种方法都特定于任何类
  • @YaWang 在我弄清楚如何做我想做的事情之前,我现在有点像这样设置它,我只是发送带有识别前缀的字符串。如果我找不到合适的方法,我可能会做类似你的想法的事情

标签: java io server inputstream outputstream


【解决方案1】:

您可能会注意到ObjectInputStream 中的readXYZ 方法对应于ObjectOutputStream 中的writeXYZ 方法。

每对方法读取或写入特定格式。如果你用writeBoolean(写一个字节)写东西,你必须用readBoolean读它。如果你用writeObject(它写一个序列化的对象)写东西,你必须用readObject读它。试图将序列化的 Boolean 对象解释为单字节布尔值是行不通的。

【讨论】:

  • @TheAwkwardChild 然后你必须发送一些东西来说明下一个是布尔值还是字符串。或者您可以使用自动处理类型的readObject/writeObject(然后使用instanceof
【解决方案2】:

当我在 while 循环中有两个线程时,一个执行 .readBoolean 而另一个 .readUTF 错误被抛出。我知道为什么这种方法行不通,但我想不出正确的方法。

没有正确的方法。从同一个套接字读取的两个线程永远不会工作。

如何通过流发送不同的类型?

你正在这样做。您的问题不在于类型,而在于并发性。

是否需要多个端口

可能,但您没有向我们充分说明您的要求,无法确定。

或者我可以用同一个流在一个上做吗?

正在在一个流上执行此操作,但您遇到了并发问题。 stmrea 本身的内容没有明确定义,两个线程读取的顺序也没有明确定义。你不能这样做。重新思考、重新设计、重新实施。

【讨论】:

    猜你喜欢
    • 2012-10-17
    • 1970-01-01
    • 2019-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    • 2019-01-04
    • 2017-08-25
    相关资源
    最近更新 更多