2010-12-02 84 views
3

我在寫一個使用Java非阻塞SocketChannel的服務器程序。有時我想發送回覆消息,然後關閉頻道,如下面的代碼。如何正確關閉非阻塞套接字通道?

但是,close()方法中斷write()方法,我得到java.nio.channels.ClosedChannelException,並且不發送消息。

我可以在關閉通道之前彈出一個線程並等待1-2秒,但是我覺得製作另一個線程太浪費了。

什麼是在掛起操作時關閉SocketChannel的正確方法?

String msg = "Wrong password!"; 
channel.write(ByteBuffer.wrap(msg.getBytes())); 
channel.close(); 
+0

這聽起來不對。 *關閉頻道後,您必須先寫*。我有這樣幾英里的代碼,它並沒有這樣做。 – EJP 2010-12-03 00:54:53

回答

-1

頻道。 socket()。 setSoLinger(true,MAX_SECONDS_FOR_OUTPUT_TO_DRAIN);

查看關於linger option的信息。如前所述,它會導致close()阻塞達到MAX_SECONDS_FOR_OUTPUT_TO_DRAIN秒。

+1

似乎不適合我,也許它只是爲了阻止套接字? – Hongbo 2010-12-02 22:59:53