`

NIO的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方法的调用才真正地关闭 本地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编程有很多这样细节性的东西需要注意,通常情况下还是利用成熟的框架为妙。

分享到:
评论
2 楼 nkd2002 2012-05-13  
你好,博主,
因而,如果,如果在取消SelectionKey后没有调用到selector的select方法(因为Client一般在取消key后,我们都会终止调用select的循环,当然,server关闭一个注册的channel我们是不会终止select循环的),那么本地socket将进入CLOSE-WAIT 状态(等待本地Socket关闭)。
这段话描述是不是不问题,CLOSE-WAIT是被动关闭socket一方才会有的状态,你说的key cancel或channel colse都是主动关闭方,怎么会有CLOSE-WAIT状态呢,不太明白。请博主解答。
1 楼 asme2u 2010-10-17  
早点来这里看看就好了 ,前段时间用NIO开发一个spider,就是因为这个问题搞得一大堆连接CLOSE_WAIT,最终程序以报too many open files收场,后来还是翻了HttpComponents才搞明白

相关推荐

    采用NIO实现一个Socket服务器

    在Java编程领域,NIO(New IO)是Java 1.4版本引入的一个新特性,全称为Non-blocking Input/Output,即非阻塞I/O。它与传统的BIO(Blocking IO)模型不同,NIO提供了更高效的数据读写方式,特别适合于高并发、低延迟...

    一个java NIO的例子

    本例子中的"NioServer"可能是一个简单的Java NIO服务器端程序,用于演示如何使用NIO进行网络通信。下面我们将深入探讨Java NIO的关键组件和工作原理。 1. **通道(Channel)**:通道是数据传输的途径,类似于传统的...

    JAVA nio的一个简单的例子

    在这个“JAVA nio的一个简单的例子”中,我们将探讨如何使用Java NIO进行简单的服务器-客户端通信,并计算字符串的哈希值。 在传统的BIO模型中,每个连接都需要一个线程来处理,当并发连接数量增加时,系统会创建...

    一个NIO服务端,客户端的例子

    NIO(Non-blocking Input/Output,非阻塞输入/输出)是Java提供的一个高效、灵活的I/O模型,尤其适用于高并发、大数据传输的场景。Netty是一个基于NIO的高性能、异步事件驱动的网络应用程序框架,它极大地简化了网络...

    mina框架--MINA框架是对java的NIO包的一个封装

    4. `LoggingFilter` 是一个日志记录过滤器,用于记录不同类型的事件,如消息接收、发送、会话创建、关闭等。这样可以帮助开发者调试和监控应用程序的行为。 5. `acceptor` 的配置还包括了设置重用地址、接收和发送...

    Java NIO系列教程(一) Java NIO 概述

    Java NIO(New IO)是Java SE 1.4版本引入的一个新的I/O处理框架,它提供了比传统Java IO包更高效的数据处理方式。NIO的核心在于其三大组件:Channels、Buffers和Selectors。本文将详细介绍这三个组件的基础概念及其...

    java NIO.zip

    通道是NIO中的核心概念之一,它提供了从一个数据源(如文件、套接字)到另一个数据源的数据传输路径。Java NIO支持多种类型的通道,包括文件通道(FileChannel)、套接字通道(SocketChannel)和服务器套接字通道...

    Nio多线程CS收发信息问题(问题已经解决)

    总结来说,"Nio多线程CS收发信息问题"涉及到在Java NIO环境下,如何构建一个多线程、高并发的客户端-服务器通信系统,并解决在这个过程中可能遇到的各种挑战。通过理解NIO的核心概念,合理设计线程管理和异常处理...

    Java NIO英文高清原版

    Netty是一个基于NIO的高性能、异步事件驱动的网络应用框架,它简化了网络编程,广泛应用于服务器端应用开发。 NIO的核心概念包括通道(Channel)、缓冲区(Buffer)和选择器(Selector)。以下是对这些核心概念的...

    基于nio的简易聊天室

    在Java编程领域,NIO(New Input/Output)是一个重要的概念,它提供了非阻塞I/O操作的能力,相比传统的BIO(Blocking I/O),在处理大量并发连接时表现出更高的效率和性能。本项目"基于nio的简易聊天室"旨在通过NIO...

    NIO编程实现实例

    在BIO中,每个连接都需要一个线程来处理,当并发连接数量增大时,会消耗大量系统资源。而NIO引入了非阻塞I/O和选择器(Selector),使得单个线程可以同时处理多个连接,从而提高了服务器的并发能力。 NIO的核心组件...

    java NIO socket聊天

    在Java NIO中,`Selector`是一个关键组件,它可以监视多个`Channel`的状态变化,比如连接建立、数据到达或者连接关闭等。当`Selector`轮询这些`Channel`时,如果发现有事件发生,它就会唤醒等待的线程进行处理,这...

    nio学习demo 处理因缓冲区满导致写入失败问题

    由于TCP是流式传输,不保留消息边界,所以多个小数据包可能会被合并成一个大数据包发送,接收端如果没有正确处理,就可能出现“沾包”现象。解决这个问题的关键在于设计一种机制,使接收端能够识别出数据包的边界。 ...

    javaNiO.doc

    为了解决这些问题,Java平台在JDK 1.4中引入了一个全新的I/O处理框架——NIO(New IO),即新I/O。本文将深入探讨传统I/O模型的问题,并详细介绍NIO的概念、优势以及其实现机制。 #### 2. 传统I/O模型及其局限性 ...

    基于nio实现的多文件上传源码

    在Java编程领域,NIO(New IO)是一个重要的特性,它是Java 1.4版本引入的,用于替代标准的IO API。NIO提供了一种非阻塞I/O操作的方式,特别适用于处理大量的并发连接,例如在文件传输、网络通信等场景。本主题...

    java nio 网络编程指南

    Java NIO API的出现解决了这一问题,它允许服务器使用一个或少数几个线程就能高效地处理成百上千的客户端连接。关键在于NIO中的非阻塞特性,它使服务器能够同时监听多个客户端的读写事件,无需为每个连接分配单独的...

    JavaNIO chm帮助文档

    Java NIO系列教程(一) Java NIO 概述 Java NIO系列教程(二) Channel Java NIO系列教程(三) Buffer Java NIO系列教程(四) Scatter/Gather Java NIO系列教程(五) 通道之间的数据传输 Java NIO系列教程(六)...

    NIO 入门.chm,NIO 入门.chm

    而在NIO中,读写操作不会阻塞线程,而是返回一个状态表示是否可以继续进行操作,从而提高系统资源利用率。 5. **文件通道(FileChannel)**:FileChannel用于文件的读写,它支持映射文件到内存,以及文件的随机访问...

    nio.rar_NIO_NIO-socket_java nio_java 实例_java.nio

    Java NIO(New IO)是Java 1.4版本引入的一个新特性,它为Java应用程序提供了非阻塞I/O操作的能力,与传统的IO模型(基于流的I/O和基于缓冲区的I/O)相比,NIO具有更高的效率和灵活性。在Java NIO中,数据是以通道...

Global site tag (gtag.js) - Google Analytics