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方法的调用才真正地关闭
本地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();
Nio编程有很多这样细节性的东西需要注意,通常情况下还是利用成熟的框架为妙。
分享到:
相关推荐
在Java编程领域,NIO(New IO)是Java 1.4版本引入的一个新特性,全称为Non-blocking Input/Output,即非阻塞I/O。它与传统的BIO(Blocking IO)模型不同,NIO提供了更高效的数据读写方式,特别适合于高并发、低延迟...
本例子中的"NioServer"可能是一个简单的Java NIO服务器端程序,用于演示如何使用NIO进行网络通信。下面我们将深入探讨Java NIO的关键组件和工作原理。 1. **通道(Channel)**:通道是数据传输的途径,类似于传统的...
在这个“JAVA nio的一个简单的例子”中,我们将探讨如何使用Java NIO进行简单的服务器-客户端通信,并计算字符串的哈希值。 在传统的BIO模型中,每个连接都需要一个线程来处理,当并发连接数量增加时,系统会创建...
NIO(Non-blocking Input/Output,非阻塞输入/输出)是Java提供的一个高效、灵活的I/O模型,尤其适用于高并发、大数据传输的场景。Netty是一个基于NIO的高性能、异步事件驱动的网络应用程序框架,它极大地简化了网络...
总结来说,"Nio多线程CS收发信息问题"涉及到在Java NIO环境下,如何构建一个多线程、高并发的客户端-服务器通信系统,并解决在这个过程中可能遇到的各种挑战。通过理解NIO的核心概念,合理设计线程管理和异常处理...
Netty是一个基于NIO的高性能、异步事件驱动的网络应用框架,它简化了网络编程,广泛应用于服务器端应用开发。 NIO的核心概念包括通道(Channel)、缓冲区(Buffer)和选择器(Selector)。以下是对这些核心概念的...
在Java编程领域,NIO(New Input/Output)是一个重要的概念,它提供了非阻塞I/O操作的能力,相比传统的BIO(Blocking I/O),在处理大量并发连接时表现出更高的效率和性能。本项目"基于nio的简易聊天室"旨在通过NIO...
在BIO中,每个连接都需要一个线程来处理,当并发连接数量增大时,会消耗大量系统资源。而NIO引入了非阻塞I/O和选择器(Selector),使得单个线程可以同时处理多个连接,从而提高了服务器的并发能力。 NIO的核心组件...
在Java NIO中,`Selector`是一个关键组件,它可以监视多个`Channel`的状态变化,比如连接建立、数据到达或者连接关闭等。当`Selector`轮询这些`Channel`时,如果发现有事件发生,它就会唤醒等待的线程进行处理,这...
由于TCP是流式传输,不保留消息边界,所以多个小数据包可能会被合并成一个大数据包发送,接收端如果没有正确处理,就可能出现“沾包”现象。解决这个问题的关键在于设计一种机制,使接收端能够识别出数据包的边界。 ...
Java NIO系列教程(一) Java NIO 概述
Java NIO系列教程(一) Java NIO 概述 Java NIO系列教程(二) Channel Java NIO系列教程(三) Buffer Java NIO系列教程(四) Scatter/Gather Java NIO系列教程(五) 通道之间的数据传输 Java NIO系列教程(六)...
而在NIO中,读写操作不会阻塞线程,而是返回一个状态表示是否可以继续进行操作,从而提高系统资源利用率。 5. **文件通道(FileChannel)**:FileChannel用于文件的读写,它支持映射文件到内存,以及文件的随机访问...
在Java编程领域,NIO(New IO)是一个重要的特性,它是Java 1.4版本引入的,用于替代标准的IO API。NIO提供了一种非阻塞I/O操作的方式,特别适用于处理大量的并发连接,例如在文件传输、网络通信等场景。本主题...
- **ConnectionEndpoint**: 表示一个网络连接,管理连接的生命周期,包括建立、保持和关闭连接。 - **BufferedInput/OutputStream**: 基于NIO的缓冲流,提高了数据读写的效率。 4. **HttpCore NIO的使用场景** -...
4. `LoggingFilter` 是一个日志记录过滤器,用于记录不同类型的事件,如消息接收、发送、会话创建、关闭等。这样可以帮助开发者调试和监控应用程序的行为。 5. `acceptor` 的配置还包括了设置重用地址、接收和发送...
- `java.nio.channels.SelectionKey`:每个已注册的通道都会有一个对应的SelectionKey,它包含了通道与选择器之间的关系以及感兴趣的事件类型。 3. NIO工作流程 - 打开通道:例如创建一个FileChannel或...
Java NIO(New IO)是Java 1.4版本引入的一个新模块,它提供了一种新的方式来处理I/O操作,相比传统的IO流,NIO提供了更高效、更灵活的数据读写方式。在这个主题中,我们将深入探讨Java NIO如何用于写文件,特别是在...
在标准 IO 中,数据是以流的形式读取和写入的,而 NIO 则将数据读取到一个缓冲区,然后再进行处理。 2. 同步和异步 标准 IO 流是线程堵塞和同步的,当一个线程调用了 read() 或 write() 方法时,该线程将被堵塞,...
传统的Java I/O模型(BIO)在处理大量并发连接时效率较低,因为它基于阻塞模式,一个线程只能处理一个连接,而NIO则允许单个线程同时处理多个连接,大大提高了性能。 `NIOServer.java`和`NIOClient.java`这两个文件...