如下异常一致困扰了我很久,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的方法了
分享到:
相关推荐
例如,我们可以在`AsynchronousSocketChannel`的`read()`和`write()`操作上使用`CompletableFuture`的链式调用来处理数据的读取和发送,以及错误处理。 在压缩包文件`tcpasyncclient-master`中,可能包含了这个简单...
当IO操作失败时,`CompletionHandler`的`failed`方法会被调用,你可以在这里处理异常。 总的来说,Java NIO 2.0的异步网络IO API提供了一种高效的方式来处理网络IO操作,特别是对于需要处理大量连接的服务器端应用...
以类AsynchronousServerSocketChannel和类AsynchronousSocketChannel的形式,以类,服务对象和客户端的实现原则为依据。 在运河NIO.2上进行的新API发布会在temos um artigointrodutório嵌套站点进行。 Vocêpodel...
它可以确保在块结束时,无论是否发生异常,资源都会被正确关闭。 4. **类型注解**:Java 7引入了类型注解,允许在类型声明上使用注解,如`@NonNull`用于标记非空参数或变量,增强了代码的可读性和静态分析工具的...
AIO的核心类包括`AsynchronousServerSocketChannel`、`AsynchronousSocketChannel`以及`CompletionHandler`。 1. `AsynchronousServerSocketChannel`:用于创建服务器端的监听通道,可以接受客户端的连接请求。通过...
《JAVA_API_1.7中文(最新、最全)》是一个专门为Java开发者设计的API文档,它详尽地涵盖了Java 7版本中的各种类库、接口、方法和异常,是学习和开发Java程序的重要参考资料。这份文档以CHM(Compiled HTML Help)...
此外,还可以通过`.isDone()`方法检查操作是否完成,以及通过`.cancel(boolean mayInterruptIfRunning)`方法取消未完成的操作。 ##### 4.2 客户端设置 客户端需要创建一个`AsynchronousSocketChannel`并尝试与...
- Java 7引入了异步Socket API,如`AsynchronousSocketChannel`和`AsynchronousServerSocketChannel`,允许在独立的线程中处理I/O操作,提高系统性能。 9. **UDP与DatagramSocket**: - UDP(用户数据报协议)是...
6. **异常处理**:网络编程中常遇到网络中断、超时等问题,源码会演示如何正确捕获并处理这些异常。 7. **网络套接字选项**:`Socket`和`ServerSocket`类提供了设置各种选项的方法,如设置超时、启用/禁用SO_...
开发人员还可以通过 `isDone()` 方法来检查操作是否已经完成,并通过 `cancel()` 方法来取消正在进行的操作。 - **使用 `CompletionHandler`**:这是一种更灵活的方式来处理异步操作的结果。开发人员可以提供一个 ...
在本主题中,我们将深入探讨"Socket源码 简单异步通信"这一概念,了解如何使用Socket进行异步通信,以及相关的源码解析。 首先,让我们定义什么是Socket。Socket,也被称为套接字,是网络通信的基本单元,它提供了...
AIO通过`java.nio.channels.AsynchronousServerSocketChannel`和`java.nio.channels.AsynchronousSocketChannel`类来实现异步的服务器端和客户端通信,使得服务器可以同时处理多个连接请求,无需为每个请求分配单独...
- 网络编程中常见的异常有`IOException`、`SocketException`等,必须正确捕获和处理。 11. **网络安全** - 网络编程涉及安全问题,如数据加密、身份验证等,可使用SSL/TLS协议,以及Java的加密库如`javax.crypto`...
你可以从中找到关于类库的结构,类的继承关系,方法的参数和返回值,以及示例代码。每个类的描述通常包括构造函数、静态方法、实例方法以及常量。此外,还提供了异常、枚举、注解等信息,帮助开发者深入理解Java编程...
NIO.2插座测试仪 一个演示应用程序,用于检查是否可以使用在TCP套接字的另一端读取所有成功的写入。 建造 仅通过从命令行运行ant即可在NetBeans中构建NetBeans ant项目: ant 跑步 在dist文件夹中创建的jar文件包含...
AIO的主要目标是提供一种方法,使得应用程序能够发起一个I/O操作,然后立即做其他事情,而当I/O操作完成时,系统会通知应用程序。这种模式使得应用可以处理更多的并发连接,特别适合于高并发、低CPU利用率的网络服务...
8. **高级话题**:可能包括网络编程的最佳实践,性能调优,以及如何处理网络异常和错误。 9. **实战案例**:通过实例代码,让读者理解并掌握所学知识,这些实例可能涵盖聊天服务器、文件传输应用、分布式系统组件等...
异步Socket在Java NIO中通过`AsynchronousSocketChannel`类实现,它提供了异步版本的读写方法,如`AsynchronousSocketChannel.read()`和`AsynchronousSocketChannel.write()`。这些方法可以配合Future和...
`AsynchronousSocketChannel` 对象提供了一些异步操作方法,例如 `read()` 和 `write()` 方法,这些方法可以异步地读取和写入套接字。 例如,可以使用 `AsynchronousSocketChannel` 对象来异步地读取套接字: ```...