nio编程过程中会出现:
Exception in thread "main" java.io.IOException: 远程主机强迫关闭了一个现有的连接。
at sun.nio.ch.SocketDispatcher.read0(Native Method)
at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:25)
at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:233)
at sun.nio.ch.IOUtil.read(IOUtil.java:206)
at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:207)
at com.rb.socket.nio.server.n.NIOServer.handleKey(NIOServer.java:87)
at com.rb.socket.nio.server.n.NIOServer.listen(NIOServer.java:57)
at com.rb.socket.nio.server.n.NIOServer.main(NIOServer.java:122)
主要原因是:客户端自己关闭了连接(没有调用SocketChannel的close方法),服务器还在read事件中,这个时候读取客户端的时候会报错。
解决办法,在客户端合适的时候,调用SocketChannel的close方法,同时服务器读取事件增加如下逻辑:
count = client.read(receivebuffer);
if(count==-1){
System.out.println(count);
client.close();
} else {
如果服务器没有client.close,则一直System.out.println(count)
所以先客户端调用close,然后服务器在read事件里面读取返回是不是-1,如果是,调用服务器这边客户端的引用的close方法,这样两边的SocketChannel都关闭了。
分享到:
相关推荐
基于NIO的远程调用框架的设计与实现 master
- 服务端会创建一个ServerSocketChannel并注册到Selector,然后在一个无限循环中调用select(),处理新的连接请求。 - 客户端创建SocketChannel,连接到服务端,然后在一个循环中读写数据。 以上是对"nio异步长...
常连接是指一个持久存在的TCP连接,避免了频繁创建和销毁连接带来的系统资源消耗和性能损耗。然而,当应用需要与多个后台服务交互时,传统的串行处理模式(即逐一访问每个服务)会导致性能瓶颈和系统健壮性下降。 ...
本例子中的"NioServer"可能是一个简单的Java NIO服务器端程序,用于演示如何使用NIO进行网络通信。下面我们将深入探讨Java NIO的关键组件和工作原理。 1. **通道(Channel)**:通道是数据传输的途径,类似于传统的...
在Java编程领域,NIO(New IO)是Java 1.4版本引入的一个新特性,全称为Non-blocking Input/Output,即非阻塞I/O。它与传统的BIO(Blocking IO)模型不同,NIO提供了更高效的数据读写方式,特别适合于高并发、低延迟...
这种方式在处理少量连接时效率尚可,但当需要处理大量连接时,每个连接都需要占用一个线程,这将极大地限制系统的并发能力。 ##### 非阻塞式I/O的优势 采用非阻塞式I/O,单个线程可以同时处理多个连接。当一个连接...
Java NIO(New IO)是Java 1.4版本引入的一个新特性,它提供了一种新的I/O操作方式,与传统的BIO(Blocking IO)模型相比,NIO具有更高的并发性能,尤其在处理大量连接请求时更为明显。NIO的核心在于非阻塞I/O,即在...
NIO(Non-blocking Input/Output,非阻塞输入/输出)是Java提供的一个高效、灵活的I/O模型,尤其适用于高并发、大数据传输的场景。Netty是一个基于NIO的高性能、异步事件驱动的网络应用程序框架,它极大地简化了网络...
通道是数据传输的路径,缓冲区用于存储数据,而选择器则允许在一个线程中同时监控多个通道的事件,例如连接请求、数据到达或写操作完成。 1. **通道(Channel)**:通道是数据读写的基本途径,它可以从一个数据源(如...
在这个“JAVA nio的一个简单的例子”中,我们将探讨如何使用Java NIO进行简单的服务器-客户端通信,并计算字符串的哈希值。 在传统的BIO模型中,每个连接都需要一个线程来处理,当并发连接数量增加时,系统会创建...
在Java NIO中,`Selector`是一个关键组件,它可以监视多个`Channel`的状态变化,比如连接建立、数据到达或者连接关闭等。当`Selector`轮询这些`Channel`时,如果发现有事件发生,它就会唤醒等待的线程进行处理,这...
Java NIO(New IO)是Java SE 1.4版本引入的一个新的I/O处理框架,它提供了比传统Java IO包更高效的数据处理方式。NIO的核心在于其三大组件:Channels、Buffers和Selectors。本文将详细介绍这三个组件的基础概念及其...
标题中的“练练手,用mina2.0搭建一个nio客户端”表明了本文将探讨如何使用Mina 2.0框架构建一个基于非阻塞I/O(NIO)的客户端应用。Mina是一个开源的Java框架,常用于开发高性能、高并发的网络通信应用,如TCP/IP和...
在Java编程领域,NIO(New IO)是一个重要的特性,它是Java 1.4版本引入的,用于替代标准的IO API。NIO提供了一种非阻塞I/O操作的方式,特别适用于处理大量的并发连接,例如在文件传输、网络通信等场景。本主题...
在传统的Java BIO(阻塞I/O)模型中,一个线程对应一个连接,当服务器处理大量并发连接时,线程资源消耗大,效率较低。而NIO和AIO则提供了更高效、更灵活的解决方案。 **Java NIO**(New Input/Output)在Java 1.4...
在Java编程领域,NIO(New Input/Output)是一种非阻塞I/O模型,它提供了比传统的IO模型更高效的数据处理方式。NIO的核心组件包括通道(Channels)...因此,在需要处理大量并发连接的场景下,NIO是一个理想的解决方案。
5. **处理连接**:对于每个准备就绪的`ServerSocketChannel`,使用`accept()`方法接受新的客户端连接,返回一个新的`SocketChannel`。这个新通道也需要注册到`Selector`,以便后续的数据读写。 6. **读写数据**:...
通道是NIO中的核心概念之一,它提供了从一个数据源(如文件、套接字)到另一个数据源的数据传输路径。Java NIO支持多种类型的通道,包括文件通道(FileChannel)、套接字通道(SocketChannel)和服务器套接字通道...