`
a3x60
  • 浏览: 7443 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java NIO服务器:远程主机强迫关闭了一个现有的连接

NIO 
阅读更多
Java NIO聊天室中,若客户端强制关闭,服务器会报“java.io.IOException: 远程主机强迫关闭了一个现有的连接。”,并且服务器会在报错后停止运行,错误的意思就是客户端关闭了,但是服务器还在从这个套接字通道读取数据,便抛出IOException,导致这种情况出现的原因就是,客户端异常关闭后,服务器的选择器会获取到与客户端套接字对应的套接字通道SelectionKey,并且这个key的兴趣是OP_READ,执行从这个通道读取数据时,客户端已套接字已关闭,所以会出现“java.io.IOException: 远程主机强迫关闭了一个现有的连接”的错误。解决这种问题也很简单,就是服务器在读取数据时,若发生异常,则取消当前key并关闭通道,如下代码:
//获取此key对应的套接字通道  
SocketChannel channel = (SocketChannel) key.channel();  
//创建一个大小为1024k的缓存区  
ByteBuffer buffer = ByteBuffer.allocate(1024);  
StringBuffer sb = new StringBuffer();  
//将通道的数据读到缓存区  
int count = 0;  
try{  
    count = channel.read(buffer);  
}catch(IOException e){  
    key.cancel();  
    channel.socket().close();  
    channel.close();  
    return;  
}


因在catch中取消了key,readMsg返回后,run方法继续往下走,之前的代码会报“java.nio.channels.CancelledKeyException”错误,所以需要判断当前key是否有效,
之前的代码:
//若此key的通道的行为是"读"  
if (key.isReadable()) {  
    readMsg(key);  
}  
//若次key的通道的行为是"写"  
if (key.isWritable()) {  
    writeMsg(key);  
}  


修复后的代码:
//若此key的通道的行为是"读"  
if (key.isValid() && key.isReadable()) {  
    readMsg(key);  
}  
//若次key的通道的行为是"写"  
if (key.isValid() && key.isWritable()) {  
    writeMsg(key);  
} 


这样改良之后的聊天室服务端,客户端异常强制关闭后,服务器便会妥善处理了,也不会报错,更不会停止运行。改良之后还算比较稳定运行的。

参考资料:http://blog.csdn.net/abc_key/article/details/29295569
分享到:
评论

相关推荐

    java nio服务器

    下面将详细介绍这些组件以及如何构建一个基本的Java NIO服务器。 1. **通道(Channels)**:通道是数据传输的途径,类似于BIO中的流。Java NIO提供了多种通道,如SocketChannel、ServerSocketChannel、FileChannel...

    JavaNIO服务器实例Java开发Java经验技巧共6页

    以上内容只是对Java NIO服务器实现的一个概述,具体教程可能会包含更多关于配置、优化和异常处理的细节,以及如何将这些技术应用到实际项目中的案例分析。对于想深入了解Java NIO的开发者来说,这份资料应该是一份...

    java NIO 视频教程

    Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从Java 1.4开始),Java NIO提供了与标准IO不同的IO工作方式。 Java NIO: Channels and Buffers(通道和缓冲区) 标准的IO基于字节流和字符流进行操作的,...

    高手使用Java NIO编写高性能的服务器

    NIO与传统的IO( Blocking IO)模型相比,最大的区别在于其非阻塞特性,使得一个线程可以同时处理多个连接请求,而无需为每个请求创建一个新的线程,从而避免了线程创建和销毁的开销,以及多线程同步的问题。...

    Java NIO实现多个客户端之间的消息互发,客户端与服务器完整代码

    在Java NIO的服务器端,通常会创建一个服务器套接字通道(ServerSocketChannel),它监听客户端的连接请求。每当有新的连接建立时,服务器都会注册这个新的套接字通道到选择器,以便后续监控其读写事件。同时,每个...

    java NIO.zip

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

    一个java NIO的例子

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

    Java NIO英文高清原版

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

    java NIO技巧及原理

    1. **Netty**:是一个高性能、异步事件驱动的网络应用框架,常用于创建服务器和客户端的TCP、UDP通信。 2. **Grizzly**:是Sun Microsystems(现Oracle)开发的一个开源NIO框架,支持HTTP、WebSocket等多种协议。 *...

    java NIO和java并发编程的书籍

    java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java...

    JavaNIO chm帮助文档

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

    java nio 通信服务器、客户端完整例子

    用java编写的nio通信的例子,nio是io编程的新版本,比io较流行。同时本例子是适用socket通信的。可以在此基础上,添加您的个人应用。本例子适用于:java通信的学习者,android平台通信的学习者。

    Java视频教程 Java游戏服务器端开发 Netty NIO AIO Mina视频教程

    jaca视频教程 jaca游戏服务器端开发 Netty NIO AIO Mina视频教程 课程目录: 一、Netty快速入门教程 01、第一课NIO 02、第二课netty服务端 03、第三课netty客户端 04、第四课netty线程模型源码分析(一) 05、...

    java NIO实例

    传统的Java I/O模型(BIO)在处理大量并发连接时效率较低,因为它基于阻塞模式,一个线程只能处理一个连接,而NIO则允许单个线程同时处理多个连接,大大提高了性能。 `NIOServer.java`和`NIOClient.java`这两个文件...

    JAVA nio的一个简单的例子

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

    java NIO详细教程

    - **通道(Channel)**:Java NIO 中的通道主要有以下几种实现形式: - **FileChannel**:用于文件的读写操作。 - **DatagramChannel**:用于 UDP 数据报的发送和接收。 - **SocketChannel** 和 **...

    java NIO推送实例

    - **服务器端(DeskAppServer)**:服务端通常会开启一个监听通道,等待客户端连接。当有新的连接请求时,会创建一个新的通道,并将其注册到选择器上,以便于后续的读写操作。 - **客户端(Desk)**:客户端首先...

    java多线程nio服务器

    Java NIO(New IO)是Java 1.4版本引入的一个新特性,它为Java提供了一种不同于传统IO( Blocking I/O)的处理I/O操作的方式。传统的IO模型基于流和缓冲区,采用同步阻塞的方式,即在读写数据时会阻塞当前线程,直到...

Global site tag (gtag.js) - Google Analytics