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的高性能、异步事件驱动的网络应用程序框架,它极大地简化了网络...
4. `LoggingFilter` 是一个日志记录过滤器,用于记录不同类型的事件,如消息接收、发送、会话创建、关闭等。这样可以帮助开发者调试和监控应用程序的行为。 5. `acceptor` 的配置还包括了设置重用地址、接收和发送...
Java NIO(New IO)是Java SE 1.4版本引入的一个新的I/O处理框架,它提供了比传统Java IO包更高效的数据处理方式。NIO的核心在于其三大组件:Channels、Buffers和Selectors。本文将详细介绍这三个组件的基础概念及其...
通道是NIO中的核心概念之一,它提供了从一个数据源(如文件、套接字)到另一个数据源的数据传输路径。Java NIO支持多种类型的通道,包括文件通道(FileChannel)、套接字通道(SocketChannel)和服务器套接字通道...
总结来说,"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平台在JDK 1.4中引入了一个全新的I/O处理框架——NIO(New IO),即新I/O。本文将深入探讨传统I/O模型的问题,并详细介绍NIO的概念、优势以及其实现机制。 #### 2. 传统I/O模型及其局限性 ...
在Java编程领域,NIO(New IO)是一个重要的特性,它是Java 1.4版本引入的,用于替代标准的IO API。NIO提供了一种非阻塞I/O操作的方式,特别适用于处理大量的并发连接,例如在文件传输、网络通信等场景。本主题...
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版本引入的一个新特性,它为Java应用程序提供了非阻塞I/O操作的能力,与传统的IO模型(基于流的I/O和基于缓冲区的I/O)相比,NIO具有更高的效率和灵活性。在Java NIO中,数据是以通道...