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注册事件的句柄,用于跟踪注册事件的状态。在...
JavaSelector在Java NIO(非阻塞I/O)中扮演着关键角色,它允许程序同时监控多个通道(channels)的事件,例如连接请求、数据可用性或者关闭事件,而无需在一个单独的线程中轮询所有通道。这种机制极大地提高了处理...
SelectableChannel类实现了Channel接口,是一种能够实现非阻塞I/O和多路复用通道的基础类。 阻塞通信是指在服务端和客户端之间的通信过程中,使用阻塞方式进行通信,会导致服务端的线程阻塞,降低服务端的效率和...
其中,`ServerSocketChannel`和`SocketChannel`是两个关键的类,分别作为服务器端和客户端的通道,它们都是`SelectableChannel`的子类,这意味着它们支持阻塞和非阻塞两种工作模式。 `ServerSocketChannel`是`...
5. 关闭不再使用的通道和选择器。 Java NIO的优势在于其灵活性和可扩展性,它能够处理大量并发连接,而且减少了线程创建和上下文切换的开销。然而,理解和使用Java NIO相对于传统的阻塞I/O模型更为复杂,需要更深入...
- `SocketChannel` 和 `ServerSocketChannel` 是Java NIO提供的重要类,它们继承自`SelectableChannel`接口。`ServerSocketChannel`用于监听客户端的连接请求,而`SocketChannel`则代表已建立的连接,两者都可以在...
- `Selector`和`SelectableChannel`是Java NIO的一部分,可用于高效地监控多个Socket通道的状态。 通过以上步骤,你可以构建一个简单的基于Socket的QQ聊天模拟器。然而,实际的QQ客户端和服务器会涉及到更复杂的...
6. 注意事项: - 通道一旦注册到Selector并设置为非阻塞,就不能再回到阻塞模式。 - 必须在非阻塞模式下才能将Channel注册到Selector。 - 选择器会检查兴趣集指定的操作是否就绪,而不是强制执行操作。 通过上述...
- **SelectableChannel**:例如`SocketChannel`和`ServerSocketChannel`,它们支持注册到Selector进行事件监听。 - **FileChannel**:用于文件I/O操作。 - **Selector**:选择器用于监听多个Channel的事件,通过...
java-nio java-nio ...AbstractInterruptibleChannel, AbstractSelectableChannel, DatagramChannel, FileChannel, Pipe.SinkChannel, Pipe.SourceChannel, SelectableChannel, ServerSocketChannel, Socke
- **SelectionKey(选择键)**:表示SelectableChannel与Selector之间的注册关系,记录了感兴趣的事件和已就绪的事件。 - **Pipe(管道)**:在两个线程间提供单向数据流。 3. **Netty的特性**: - **零拷贝...
1. **SelectableChannel**:表示可以进行选择操作的通道,是所有可选择通道的父接口,如SocketChannel、ServerSocketChannel等。 2. **Buffer、Charset、ByteOrder**:Buffer类用于在Channel与应用之间传输数据,...
- 缺少异常处理:NIO中的异常处理不如BIO直观,需要额外注意。 - 回调机制:NIO通常不支持异步回调,需要轮询或使用其他机制来处理完成的事件。 综上所述,NIO为Java程序员提供了一种高效的I/O编程方式,尤其适用...
最后,Java 7的`try-with-resources`语句与NIO.2结合,使得资源关闭更加安全可靠,避免了传统的finally块可能导致的资源泄露问题。 总结来说,Java 7的NIO.2 API带来了以下关键改进: 1. 更强大的文件系统操作,如`...
`Selector`、`SelectableChannel`和`SelectionKey`是核心组件,它们允许程序同时监控多个通道的事件,减少了线程的使用,提高了性能。 在进行网络编程时,异常处理至关重要。例如,网络连接断开、数据传输错误等都...
`java.nio.channels`包中的`Selector`和`SelectableChannel`等类可以帮助实现这一目标。 下载池的核心组件通常包括以下几个部分: 1. **任务队列**:存储待下载的任务,新任务被添加到队列中,等待线程池中的线程...
- SelectionKey:表示SelectableChannel与Selector的注册关系,包含关注的事件类型和状态信息。 3. Netty 的特点: - 高性能:Netty通过优化的缓冲区管理、零拷贝技术、线程模型等,实现了高性能的网络通信。 - ...
对于NIO,`Selector`和`SelectableChannel`等类提供了非阻塞I/O的能力,这对于高并发的网络应用尤其有用。 总的来说,理解Java的I/O系统需要对各种类和接口有深入的了解,包括它们的职责、相互关系以及如何组合使用...