如何在java中将对象序列化为非阻塞套接字

时间:2011-04-19 17:56:57

标签: java asynchronous io nio

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

以下是上述文章中的代码段:

else if ( key.isWritable() ) {

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

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

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

1 个答案:

答案 0 :(得分:3)

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

  

这段代码的问题在于   PrintWriter阻止I / O而不阻止I / O.   支持底层异步   I / O机制。要解决这个问题   问题,我们不能使用任何一个   标准的I / O实用程序,而是   必须将我们的消息包装在ByteBuffer中   对象并通过它发送   SocketChannel对象

该代码在您的案例中不起作用吗?

你说:

  

我正在试图弄清楚如何   将对象转换为byte []。   字符串具有getBytes()方法。一世   我不确定一般用什么   可序列化的对象。我一直在用   但是ObjectOutput / InputStream类   根据文章,如果我使用   他们,它会再次阻止。我   正确理解这个?

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

编辑:另外,我同意文章的作者的说法,NIO很难做到正确。作者推荐Apache Mina,但我想添加另一个推荐“Jboss Netty”。 Netty的作者经常光顾SO,所以你可以回答你的疑问。

我还想指出,如果你的动机是发送跨Java对象,请使用一个可以满足这些需求的框架,即Java RMI或JBoss远程处理。比使用对象流等更容易。