关闭非阻塞套接字通道

时间:2012-02-02 08:34:31

标签: java sockets nio nonblocking

我想在写一个字符串byebye后关闭Java非阻塞套接字通道。但是,非阻塞模式下的方法会立即返回,因此调用close()可能会导致正在进行的写入操作抛出ClosedChannelException

我可以想到2个解决方法:

  1. 弹出一个帖子并在关闭前等待几毫秒。
  2. 关闭前切换到阻止模式,但Java doc says

      

    “在使用选择器注册之前,必须将通道置于非阻塞模式,并且在取消注册之前可能不会返回到阻止模式”

  3.      无论如何,我觉得两种方式都很脏。是否有一种优雅的方式来处理这个问题?

    代码:

    String msg = "byebye";
    channel.write(ByteBuffer.wrap(msg.getBytes()));
    channel.close();
    

1 个答案:

答案 0 :(得分:1)

  

调用close()可能会导致正在进行的写操作抛出一个   ClosedChannelException。

不,不会。 write()方法抛出该异常。一旦write()方法退出,就不能抛出它。数据保留在内核的套接字输出缓冲区中以便写入。