【问题标题】:How can I serialize an object to a non-blocking socket in java如何在java中将对象序列化为非阻塞套接字
【发布时间】:2011-08-08 21:35:05
【问题描述】:

我一直在阅读有关 java nio 和非阻塞套接字的信息,我想将序列化对象写入套接字。我在这里http://www.owlmountain.com/tutorials/NonBlockingIo.htm#_Toc524339525 阅读了这篇文章,它说如果你将非阻塞套接字包裹在 PrintWriter 周围,它将被阻塞。我想知道如果我将 socket.getOutputStream 包裹在 ObjectOutputStream 周围是否相同?有什么简单的方法可以测试包装器是否会阻塞?我在 PrintWriter 或 ObjectOutputStream 文档中找不到任何提及。

这里是上面文章中的代码sn-p:

else if ( key.isWritable() ) {

    Socket socket = (Socket) key.attachment();

    PrintWriter out = new PrintWriter( socket.getOutputStream(), true );

    out.println( "What is your name? " );
}

【问题讨论】:

    标签: java asynchronous io nio


    【解决方案1】:

    不确定您是否错过了它,但文章清楚地表明,使用的任何传统 I/O 实用程序都不会介入,而是展示了用于从异步通道读取和写入文本的示例代码。以下是相关摘录:

    这段代码的问题在于 PrintWriter 会阻塞 I/O,但不会 支持底层异步 I/O 机制。为了处理这个 问题,我们不能使用任何 标准 I/O 实用程序,而是 必须将我们的消息包装在 ByteBuffer 中 对象并通过 SocketChannel 对象

    该代码在您的情况下不起作用吗?

    你说:

    我正在想办法 将对象转换为字节[]。 字符串具有 getBytes() 方法。一世 我不知道一般用什么 可序列化的对象。我一直在使用 ObjectOutput/InputStream 类,但 根据文章,如果我使用 他们,它会再次阻塞。我是不是 理解正确吗?

    你是对的;用 ObjectInputStream/ObjectOutputStream 包装 I/O 流将再次导致阻塞。这里的解决方案可能是将ByteArrayOutputStream 包装在ObjectOutputStream 中,并将您的对象写入底层字节数组。这个底层字节流/数组现在具有对象的字节表示(显然遵循 Java 序列化规范)。从那时起,这就是 NIO 的正常工作。如果你有兴趣,有一些很好的讨论 herehere 与我正在谈论的事情有关。

    编辑:另外,我同意文章作者的观点,即 NIO 很难做到正确。作者推荐 Apache Mina,但我想添加另一个推荐,“Jboss Netty”。 Netty 的作者经常光顾 SO,因此您可以回答您的问题。

    我还想指出,如果您的动机是跨 Java 对象发送,请使用针对这些需求进行调整的框架,即 Java RMI 或 JBoss 远程处理。比处理对象流等要容易得多。

    【讨论】:

    • 我完全错过了那条评论。但是,是的,我试图弄清楚如何将对象转换为字节 []。字符串具有 getBytes() 方法。我不确定一般可序列化对象使用什么。我一直在使用 ObjectOutput/InputStream 类,但根据文章,如果我使用它们,它将再次阻塞。我理解正确吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 2010-10-31
    • 2013-10-15
    • 1970-01-01
    • 2010-11-04
    • 2011-12-19
    • 1970-01-01
    相关资源
    最近更新 更多