`
LiYunpeng
  • 浏览: 954296 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

关于AsynchronousSocketChannel的正确关闭方法,以及关闭出错异常AsynchronousCloseException的处理

    博客分类:
  • Java
阅读更多
如下异常一致困扰了我很久,Google和度娘了很久都没有解决,突然某天脑子抽风,就想到了如下
java.nio.channels.AsynchronousCloseException
at sun.nio.ch.UnixAsynchronousSocketChannelImpl.finishRead(UnixAsynchronousSocketChannelImpl.java:408) ~[?:1.8.0_45]
at sun.nio.ch.UnixAsynchronousSocketChannelImpl.finish(UnixAsynchronousSocketChannelImpl.java:191) ~[?:1.8.0_45]
at sun.nio.ch.UnixAsynchronousSocketChannelImpl.implClose(UnixAsynchronousSocketChannelImpl.java:225) ~[?:1.8.0_45]
at sun.nio.ch.AsynchronousSocketChannelImpl.close(AsynchronousSocketChannelImpl.java:144) ~[?:1.8.0_45]


出现这个异常的原因其实就是正在从channel读取数据,Input还在走,所以直接close掉是不行的
但是,按照Google的某些描述,进行如下操作
channel.shutdownInput();
channel.shutdownOutput();
channel.close();
其实依然会有这个异常的抛出,后来某天突然想到,这个Channel本身就是异步的,那么shutdown是不是也是异步处理的,也就是shutdown完之后,还没有真正的shutdown掉就执行了close,这样的话,就和之前的不执行shutdown没什么区别了
于是,就在执行者三条语句的时候,异步的分别执行了,执行完第一个,起一个线程执行第二个,执行完第二个起一个线程执行第三个


因为之前分析得出,其实再执行shutdownInput的操作之后,在跳出这个方法栈之后,Read的监听事件还会做一次响应,这个时候的CompletionHandler接口的实现方法completed的第一个参数result值是小于0的,所以执行完这个之后,才应该算彻底的shutdown掉了,然后就可以执行close的方法了
分享到:
评论

相关推荐

    tcpasyncclient:使用 AsynchronousSocketChannel 和 CompletableFuture 的简单 TCP 客户端

    例如,我们可以在`AsynchronousSocketChannel`的`read()`和`write()`操作上使用`CompletableFuture`的链式调用来处理数据的读取和发送,以及错误处理。 在压缩包文件`tcpasyncclient-master`中,可能包含了这个简单...

    java nio 2

    当IO操作失败时,`CompletionHandler`的`failed`方法会被调用,你可以在这里处理异常。 总的来说,Java NIO 2.0的异步网络IO API提供了一种高效的方式来处理网络IO操作,特别是对于需要处理大量连接的服务器端应用...

    Java-NIO-2-async-channels:#Neste artigo,使用简单的服务作为Java 7 NIO.2的API来简化客户端的使用。 将Veremos作为类AsynchronousServerSocketChannel和AsynchronousSocketChannel,将其作为类的原理,可以作为服务对象,也可以作为客户端

    以类AsynchronousServerSocketChannel和类AsynchronousSocketChannel的形式,以类,服务对象和客户端的实现原则为依据。 在运河NIO.2上进行的新API发布会在temos um artigointrodutório嵌套站点进行。 Vocêpodel...

    JAVA_API_1.7中文文档.rar

    它可以确保在块结束时,无论是否发生异常,资源都会被正确关闭。 4. **类型注解**:Java 7引入了类型注解,允许在类型声明上使用注解,如`@NonNull`用于标记非空参数或变量,增强了代码的可读性和静态分析工具的...

    Java AIO 实例(转)

    AIO的核心类包括`AsynchronousServerSocketChannel`、`AsynchronousSocketChannel`以及`CompletionHandler`。 1. `AsynchronousServerSocketChannel`:用于创建服务器端的监听通道,可以接受客户端的连接请求。通过...

    JAVA_API_1.7中文(最新、最全).chm.7z

    《JAVA_API_1.7中文(最新、最全)》是一个专门为Java开发者设计的API文档,它详尽地涵盖了Java 7版本中的各种类库、接口、方法和异常,是学习和开发Java程序的重要参考资料。这份文档以CHM(Compiled HTML Help)...

    JAVA异步通信教程

    此外,还可以通过`.isDone()`方法检查操作是否完成,以及通过`.cancel(boolean mayInterruptIfRunning)`方法取消未完成的操作。 ##### 4.2 客户端设置 客户端需要创建一个`AsynchronousSocketChannel`并尝试与...

    java socket

    - Java 7引入了异步Socket API,如`AsynchronousSocketChannel`和`AsynchronousServerSocketChannel`,允许在独立的线程中处理I/O操作,提高系统性能。 9. **UDP与DatagramSocket**: - UDP(用户数据报协议)是...

    java网络编程第4版源码java network programming 4th edition source code

    6. **异常处理**:网络编程中常遇到网络中断、超时等问题,源码会演示如何正确捕获并处理这些异常。 7. **网络套接字选项**:`Socket`和`ServerSocket`类提供了设置各种选项的方法,如设置超时、启用/禁用SO_...

    JDK_7_NIO2

    开发人员还可以通过 `isDone()` 方法来检查操作是否已经完成,并通过 `cancel()` 方法来取消正在进行的操作。 - **使用 `CompletionHandler`**:这是一种更灵活的方式来处理异步操作的结果。开发人员可以提供一个 ...

    Socket源码 简单异步通信

    在本主题中,我们将深入探讨"Socket源码 简单异步通信"这一概念,了解如何使用Socket进行异步通信,以及相关的源码解析。 首先,让我们定义什么是Socket。Socket,也被称为套接字,是网络通信的基本单元,它提供了...

    基于AIO的超轻量HTTP服务器实现

    AIO通过`java.nio.channels.AsynchronousServerSocketChannel`和`java.nio.channels.AsynchronousSocketChannel`类来实现异步的服务器端和客户端通信,使得服务器可以同时处理多个连接请求,无需为每个请求分配单独...

    Java网络编程基础用法详解.rar

    - 网络编程中常见的异常有`IOException`、`SocketException`等,必须正确捕获和处理。 11. **网络安全** - 网络编程涉及安全问题,如数据加密、身份验证等,可使用SSL/TLS协议,以及Java的加密库如`javax.crypto`...

    JDK_API_1_6_zh_CN.zip_6_API_jdk

    你可以从中找到关于类库的结构,类的继承关系,方法的参数和返回值,以及示例代码。每个类的描述通常包括构造函数、静态方法、实例方法以及常量。此外,还提供了异常、枚举、注解等信息,帮助开发者深入理解Java编程...

    nio2test:测试对NIO.2 AsynchronousSocketChannel的连续写入

    NIO.2插座测试仪 一个演示应用程序,用于检查是否可以使用在TCP套接字的另一端读取所有成功的写入。 建造 仅通过从命令行运行ant即可在NetBeans中构建NetBeans ant项目: ant 跑步 在dist文件夹中创建的jar文件包含...

    java 之异步套接字编程实例(AIO)

    AIO的主要目标是提供一种方法,使得应用程序能够发起一个I/O操作,然后立即做其他事情,而当I/O操作完成时,系统会通知应用程序。这种模式使得应用可以处理更多的并发连接,特别适合于高并发、低CPU利用率的网络服务...

    电子书-Java网络高级编程

    8. **高级话题**:可能包括网络编程的最佳实践,性能调优,以及如何处理网络异常和错误。 9. **实战案例**:通过实例代码,让读者理解并掌握所学知识,这些实例可能涵盖聊天服务器、文件传输应用、分布式系统组件等...

    java异步通信示例

    异步Socket在Java NIO中通过`AsynchronousSocketChannel`类实现,它提供了异步版本的读写方法,如`AsynchronousSocketChannel.read()`和`AsynchronousSocketChannel.write()`。这些方法可以配合Future和...

    Java文件系统访问1

    `AsynchronousSocketChannel` 对象提供了一些异步操作方法,例如 `read()` 和 `write()` 方法,这些方法可以异步地读取和写入套接字。 例如,可以使用 `AsynchronousSocketChannel` 对象来异步地读取套接字: ```...

Global site tag (gtag.js) - Google Analytics