[英]How can I serialize an object to a non-blocking socket in java
我一直在閱讀有關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? " );
}
不知道您是否錯過了它,但是該文章清楚地表明,使用的任何常規I / O實用程序都不會插入並提供用於從異步通道讀取和寫入文本的示例代碼。 這是相關的摘錄:
此代碼的問題在於PrintWriter會阻止I / O,並且不支持底層的異步I / O機制。 為了解決此問題,我們不能使用任何標准的I / O實用程序,而必須將消息包裝在ByteBuffer對象中並通過SocketChannel對象發送
該代碼在您的情況下不起作用嗎?
你說:
我試圖弄清楚如何將一個對象轉換為byte []。 字符串具有getBytes()方法。 我不確定用於一般可序列化對象的內容。 我一直在使用ObjectOutput / InputStream類,但根據文章所述,如果使用它們,它將再次被阻塞。 我理解正確嗎?
你是對的; 用ObjectInputStream
/ ObjectOutputStream
包裝I / O流將再次導致阻塞。 此處的解決方案可能是將ByteArrayOutputStream
包裝在ObjectOutputStream
然后將您的對象寫入基礎字節數組。 現在,此基礎字節流/數組具有對象的字節表示形式(顯然遵循Java序列化規范)。 從那以后,這就是NIO的正常工作。 如果您有興趣, 這里和這里有一些與我正在談論的事情相關的不錯的討論。
編輯:另外,我同意文章的作者,NIO很難正確。 作者推薦使用Apache Mina,但我還要添加另一條建議“ Jboss Netty”。 Netty的作者經常這樣做,因此您可以回答您的問題。
我還要指出的是,如果您的動機是跨Java對象發送消息,請使用適合這些需求的框架,例如Java RMI或JBoss遠程處理。 比處理對象流等容易得多。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.