`
flyPig
  • 浏览: 139846 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

SelectableChannel关闭注意事项

    博客分类:
  • Java
阅读更多
SocketChannel和ServerSocketChannel,两者的父类是SelectableChannel,它在jdk中的文档有这么段话:

   Once registered with a selector, a channel remains registered until it is deregistered.This involves deallocating whatever resources were allocated to the channel by the selector.
    A channel cannot be deregistered directly; instead, the key representing its registration must be cancelled. Cancelling a key requests that the channel be deregistered during the selector's next selection operation.


也就是说关闭一个已经注册的SelectableChannel需要两个步骤:

1)取消注册的key,这个可以通过SelectionKey.cancel方法,也可以通过SelectableChannel.close方法,或者中断阻塞在该channel上的IO操作的线程来做到。

2)后续的Selector.selectXXX方法的调用才真正地关闭 Native Socket。

如果在取消SelectionKey后没有调用到selector的select方法(因为Client一般在取消key后,我们都会终止调用select的循环,当然,server关闭一个注册的channel我们是不会终止select循环的),那么本地socket将进入 CLOSE-WAIT 状态(等待本地Socket关闭)。简单的解决办法是在 SelectableChannel.close方法之后调用Selector.selectNow方法,类似:

   Selector sel;
   SocketChannel sch;
   // …
   sch.close();
   sel.selectNow();
分享到:
评论

相关推荐

    阻塞通信和非阻塞通信的区别

    SelectableChannel的子类,例如ServerSocketChannel和SocketChannel,继承了SelectableChannel的基本操作,并添加了自己的特殊操作。 SelectionKey是SelectableChannel注册事件的句柄,用于跟踪注册事件的状态。在...

    java selector 测试并发

    JavaSelector在Java NIO(非阻塞I/O)中扮演着关键角色,它允许程序同时监控多个通道(channels)的事件,例如连接请求、数据可用性或者关闭事件,而无需在一个单独的线程中轮询所有通道。这种机制极大地提高了处理...

    JAVA非阻塞通信技术原理研究与实现.pdf

    SelectableChannel类实现了Channel接口,是一种能够实现非阻塞I/O和多路复用通道的基础类。 阻塞通信是指在服务端和客户端之间的通信过程中,使用阻塞方式进行通信,会导致服务端的线程阻塞,降低服务端的效率和...

    java nio 网络编程指南

    它能够同时监控多个SelectableChannel的I/O状态,一旦某个Channel准备就绪,Selector就能立即通知应用,进行相应的I/O操作。Selector通过三个关键集合管理注册在其上的SelectionKey: - 所有SelectionKey集合:包含...

    阻塞及非阻塞通信

    其中,`ServerSocketChannel`和`SocketChannel`是两个关键的类,分别作为服务器端和客户端的通道,它们都是`SelectableChannel`的子类,这意味着它们支持阻塞和非阻塞两种工作模式。 `ServerSocketChannel`是`...

    linux nio和java.zip

    5. 关闭不再使用的通道和选择器。 Java NIO的优势在于其灵活性和可扩展性,它能够处理大量并发连接,而且减少了线程创建和上下文切换的开销。然而,理解和使用Java NIO相对于传统的阻塞I/O模型更为复杂,需要更深入...

    Java网络编程(5).pdf

    - `SocketChannel` 和 `ServerSocketChannel` 是Java NIO提供的重要类,它们继承自`SelectableChannel`接口。`ServerSocketChannel`用于监听客户端的连接请求,而`SocketChannel`则代表已建立的连接,两者都可以在...

    Socket编程QQ实现 JAVA

    - `Selector`和`SelectableChannel`是Java NIO的一部分,可用于高效地监控多个Socket通道的状态。 通过以上步骤,你可以构建一个简单的基于Socket的QQ聊天模拟器。然而,实际的QQ客户端和服务器会涉及到更复杂的...

    Java NIO Selector用法详解【含多人聊天室实例】

    6. 注意事项: - 通道一旦注册到Selector并设置为非阻塞,就不能再回到阻塞模式。 - 必须在非阻塞模式下才能将Channel注册到Selector。 - 选择器会检查兴趣集指定的操作是否就绪,而不是强制执行操作。 通过上述...

    netty的自己写的文档

    - **SelectableChannel**:例如`SocketChannel`和`ServerSocketChannel`,它们支持注册到Selector进行事件监听。 - **FileChannel**:用于文件I/O操作。 - **Selector**:选择器用于监听多个Channel的事件,通过...

    mina:Java Nio Apache Mina Java Nio

    java-nio java-nio ...AbstractInterruptibleChannel, AbstractSelectableChannel, DatagramChannel, FileChannel, Pipe.SinkChannel, Pipe.SourceChannel, SelectableChannel, ServerSocketChannel, Socke

    Netty面试专题及答案.pdf

    - **SelectionKey(选择键)**:表示SelectableChannel与Selector之间的注册关系,记录了感兴趣的事件和已就绪的事件。 - **Pipe(管道)**:在两个线程间提供单向数据流。 3. **Netty的特性**: - **零拷贝...

    用nio实现异步连接池

    1. **SelectableChannel**:表示可以进行选择操作的通道,是所有可选择通道的父接口,如SocketChannel、ServerSocketChannel等。 2. **Buffer、Charset、ByteOrder**:Buffer类用于在Channel与应用之间传输数据,...

    NIO编程实现实例

    - 缺少异常处理:NIO中的异常处理不如BIO直观,需要额外注意。 - 回调机制:NIO通常不支持异步回调,需要轮询或使用其他机制来处理完成的事件。 综上所述,NIO为Java程序员提供了一种高效的I/O编程方式,尤其适用...

    java7 新I/O知识点详解

    最后,Java 7的`try-with-resources`语句与NIO.2结合,使得资源关闭更加安全可靠,避免了传统的finally块可能导致的资源泄露问题。 总结来说,Java 7的NIO.2 API带来了以下关键改进: 1. 更强大的文件系统操作,如`...

    java网络编程

    `Selector`、`SelectableChannel`和`SelectionKey`是核心组件,它们允许程序同时监控多个通道的事件,减少了线程的使用,提高了性能。 在进行网络编程时,异常处理至关重要。例如,网络连接断开、数据传输错误等都...

    下载池源码

    `java.nio.channels`包中的`Selector`和`SelectableChannel`等类可以帮助实现这一目标。 下载池的核心组件通常包括以下几个部分: 1. **任务队列**:存储待下载的任务,新任务被添加到队列中,等待线程池中的线程...

    Netty面试专题及答案

    - SelectionKey:表示SelectableChannel与Selector的注册关系,包含关注的事件类型和状态信息。 3. Netty 的特点: - 高性能:Netty通过优化的缓冲区管理、零拷贝技术、线程模型等,实现了高性能的网络通信。 - ...

    外文翻译—Java(译文+英文).doc

    对于NIO,`Selector`和`SelectableChannel`等类提供了非阻塞I/O的能力,这对于高并发的网络应用尤其有用。 总的来说,理解Java的I/O系统需要对各种类和接口有深入的了解,包括它们的职责、相互关系以及如何组合使用...

Global site tag (gtag.js) - Google Analytics