【问题标题】:How to close a non blocking socket channel properly?如何正确关闭非阻塞套接字通道?
【发布时间】:2011-05-19 10:50:18
【问题描述】:

我正在使用 Java 非阻塞 SocketChannel 编写服务器程序。有时我想发送一个回复消息然后关闭频道,如下代码。

但是,close() 方法中断了 write() 方法,我得到一个 java.nio.channels.ClosedChannelException 并且消息没有发送。

我可以弹出一个线程等待1-2秒再关闭频道,但是我觉得再做一个线程太浪费了。

当有挂起的操作时关闭 SocketChannel 的正确方法是什么?

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

【问题讨论】:

  • 这听起来不对。您必须在关闭频道后进行写入。我有数英里这样的代码,但它不会那样做。

标签: java sockets networking nonblocking


【解决方案1】:

channel.socket().setSoLinger(true, MAX_SECONDS_FOR_OUTPUT_TO_DRAIN);

查看linger option 上的信息。如前所述,它将导致 close() 最多阻塞 MAX_SECONDS_FOR_OUTPUT_TO_DRAIN 秒。

【讨论】:

  • 似乎对我不起作用,也许它只是为了阻塞套接字?
  • 它只会在阻塞模式下这样做,在这种模式下,它基本上是不必要的。他处于非阻塞模式。
猜你喜欢
  • 1970-01-01
  • 2010-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-26
相关资源
最近更新 更多