基本概念:参考http://zhangshixi.iteye.com/blog/679959作者的系列文章即可
NIO因为其高效性,成为了服务端的首选,大大提高了服务端的响应效率。
我自己读完作者的文章,写了一个简单的DEMO
服务端:
package com.liuc.io;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.charset.Charset;
import java.util.Iterator;
import java.util.Set;
import org.apache.log4j.Logger;
public class NIOServer extends Thread {
private Logger log=Logger.getLogger(NIOServer.class);
private boolean stop=false;
private String ip="localhost";
private int port=9999;
private Selector selector;
private ByteBuffer buffer=ByteBuffer.allocate(1024);
private Charset gbkCharset = Charset.forName( "GB2312" );
public NIOServer() {
try {
selector=Selector.open();
ServerSocketChannel ssc=ServerSocketChannel.open();
InetSocketAddress address=new InetSocketAddress(ip, port);
//ServerSocket绑定IP
ssc.socket().bind(address);
//设置为非阻塞模式
ssc.configureBlocking(false);
//向选择器注册
ssc.register(selector,SelectionKey.OP_ACCEPT);
System.out.println("Listen to port:"+port);
} catch (IOException e) {
log.error(e);
}
}
@Override
public void run() {
System.out.println("deal with request");
while(!stop){
String content="HelloWorld";
try {
int numKeys = selector.select();
Set<SelectionKey> selectionKeys=selector.selectedKeys();
Iterator<SelectionKey> iterator=selectionKeys.iterator();
while (iterator.hasNext()) {
SelectionKey key = iterator.next();
iterator.remove();
dealRequest(key,content);
}
} catch (IOException e) {
log.equals(e);
}
}
}
private void dealRequest(SelectionKey key,String contentToSend) {
try {
StringBuffer clientContent=new StringBuffer();
if(key.isAcceptable()){//测试此键的通道是否已准备好接受新的套接字连接。
ServerSocketChannel ssc=(ServerSocketChannel) key.channel();
SocketChannel sc=ssc.accept();
sc.configureBlocking(false);
sc.register(selector, SelectionKey. OP_READ);
}else if(key.isReadable()) {//测试此键的通道是否已准备好进行读取。
SocketChannel sc=(SocketChannel) key.channel();
while(true){//读取全部数据
buffer.clear();
int r=sc.read(buffer);
buffer.flip();
byte[] temp=new byte[r];
if (r<=0) {
break;
}
clientContent.append(gbkCharset.decode(buffer).toString());
}
//获取全部的数据
String content=clientContent.toString();
String[] info=content.split(",");//用户名密码验证
System.out.println("客户端的验证请求为:"+content);
sc.register(selector, SelectionKey.OP_WRITE);
}else if(key.isWritable()){//测试此键的通道是否已准备好进行写入
System.out.println("要发送的消息为"+contentToSend);
buffer.clear();
buffer.put(contentToSend.getBytes());
buffer.flip();
SocketChannel sc = (SocketChannel)key.channel();
sc.write(buffer);
buffer.flip();
//发送完信息后关闭连接
key.cancel();
sc.close();
}
} catch (IOException e) {
System.out.println(e);
//客户端断开连接,所以从Selector中取消注册
key.cancel();
if(key.channel() != null)
try {
key.channel().close();
log.debug("the client socket is closed!");
//System.out.println("the client socket is closed!");
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
public static void main(String[] args){
new NIOServer().start();
}
}
客户端:
package com.liuc.io;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class NIOClient {
/**
* @param args
*/
public static void main(String[] args) {
Socket socket=null;
OutputStream outputStream=null;
InputStream inputStream=null;
try {
socket=new Socket("localhost", 9999);
outputStream=socket.getOutputStream();
String sendContent="HelloWorld";
outputStream.write(sendContent.getBytes());
outputStream.flush();
inputStream=socket.getInputStream();
byte[] bytes=new byte[1024];
int n=inputStream.read(bytes);
System.out.println(new String(bytes));
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
if(inputStream!=null){
inputStream.close();
}
if (outputStream!=null) {
outputStream.close();
}
if (socket!=null) {
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
分享到:
相关推荐
四、NIO应用实例 1. **文件操作**:使用FileChannel进行文件的读写,例如将一个文件复制到另一个文件。 2. **网络通信**:使用SocketChannel和ServerSocketChannel进行客户端和服务器端的连接与数据传输。 3. **多...
IBM的NIO入门教程通常会涵盖这些基础概念,并通过实例演示如何使用NIO进行实际的I/O操作。教程可能还会深入讲解NIO的高级特性,如scatter/gather(分散/聚集)读写,以及如何使用`Selector`进行多路复用。通过学习这...
[第4节] JavaNIO流-通道1.flv [第5节] Java NIO流-通道2.flv [第6节] Java NIO流-socket通道操作.flv [第7节] Java NIO流-文件通道操作.flv [第8节] Java NIO流-选择器 .flv [第9节] Java NIO流-选择器操作.flv...
"Java入门与实例"针对的是对编程感兴趣的初学者,它提供了通俗易懂的讲解和实践案例,帮助初学者快速掌握Java编程基础。 Java的基础知识点包括: 1. **环境搭建**:首先,学习Java需要安装Java Development Kit ...
这个名为“Java入门与实例”的资源包显然是为初级Java开发者设计的,旨在提供基础知识和实践案例,帮助他们快速掌握编程技能。 首先,让我们深入了解Java语言的基础知识。Java是一种面向对象的语言,由Sun ...
Java基础编程实例是Java初学者入门的绝佳资源,它涵盖了Java语言的核心概念和技术。这个教程旨在帮助新手理解并掌握Java编程的基本元素,从而能够独立编写简单的程序。以下是一些主要的知识点: 1. **Java环境配置*...
Java2入门与实例教程是一本面向初学者的编程教材,主要涵盖了Java语言的基础知识和实践应用。这本书旨在帮助读者从零开始,逐步掌握Java编程的基本概念、语法和编程技巧。以下将详细介绍书中可能包含的一些核心知识...
这个Java入门与实例教程将通过丰富的实例和详细的解释,帮助初学者逐步建立起坚实的Java编程基础,为更高级的Java开发打下坚实的基础。通过实践这些实例,你不仅能够掌握理论知识,还能提高实际编程能力,从而在Java...
12. **IO与NIO**:了解传统的IO模型,以及Java NIO(非阻塞I/O)的优势和使用场景。 13. **多线程**:学习如何创建和管理线程,理解线程同步和互斥的概念,使用synchronized关键字和Lock接口确保线程安全。 14. **...
本资源“java从入门到精通书籍教学用PPT”是为初学者设计的一套全面的学习材料,旨在帮助读者从零基础快速掌握Java编程的基础知识和实战技能。 在学习Java的过程中,首先会涉及的是基础语法,包括数据类型(如整型...
IO流和NIO(非阻塞I/O)也是Java开发中不可或缺的部分,用于读写文件、网络通信等。 最后,线程和并发编程在多核处理器时代变得尤为重要。Java提供了丰富的并发工具,如synchronized关键字、Thread类和...
《Java从入门到提升》是一份综合性的学习资源,涵盖了初学者从接触Java语言到熟练掌握的全过程。这个资料包的出现,无疑是为那些渴望在编程领域深入学习Java的人提供了宝贵的资源。 首先,我们从“Java基础程序”这...
在I/O流方面,Java 7引入了NIO.2(New I/O 2.0),提供了更强大和更灵活的文件操作能力,包括文件路径API、异步文件通道以及文件属性的处理。这些新特性使得开发者可以更高效地处理大量输入输出操作。 除此之外,书...
在Java编程领域,IO(Input/Output)和NIO(Non-blocking Input/Output)是两种不同的I/O模型,它们在处理数据输入和输出时有着显著的...希望这个简要的介绍能帮助你入门NIO,并鼓励你进一步探索这个强大的I/O模型。
本资源包"Java 7 入门经典源代码和习题解答"是专为初学者设计的,旨在帮助学习者快速掌握Java 7的基础知识。 首先,让我们深入了解Java 7中的关键特性: 1. **自动资源管理(try-with-resources)**:这是一个语法...
Java初学者入门基础文档是一份全面的教程,旨在帮助新手快速掌握Java编程语言的基本概念和技能。这份资料共分为15个章节,每个章节都深入浅出地讲解了Java编程的关键知识点,并通过实例来加深理解。 第1章:Java...
在"Java基础入门教程"中,你将系统学习这些基础知识,并通过实例练习加深理解。"JavaNew1-8.pdf"很可能包含了详细的章节讲解和示例代码,帮助你逐步掌握Java编程。无论是打算开发桌面应用、移动应用还是服务器端应用...
本入门实例将带你了解如何使用Mina进行基本的网络通信。 首先,我们从环境配置开始。这个实例要求使用Maven作为项目构建工具,因此你需要确保已经安装了Maven,并且在项目中设置了正确的`pom.xml`文件。在`pom.xml`...
通过这个实例宝典,开发者将能够深入理解并熟练运用Java SDK 5.0的这些关键特性,提升编程能力和代码质量。同时,由于文档是英文版,对于提高英语阅读能力也有一定帮助,尤其是专业术语的理解。